工厂模式分工厂方法模式和抽象工厂模式,下次再介绍抽象工厂模式。
工厂是什么地方,是用来生成产品的地方,放在编程语言中,就是产生对象的地方。下面是Demo,包含以下几种“元素”
1.产品模子,就是一个接口,只定义方法,不实现方法。Demo中用到的是Animal接口。
2.产品,就是接口的实现类。Demo中用到的是Tiger,Bird,Fish类。
3.工厂,就是产生产品对象的类。Demo中用到的是ForestFactory类。
4.生产者,就是通过工厂生产产品的类。Demo中用到的是God类。
(1)Animal接口:
package com.example.factory;
public interface Animal {
public void move();
public void voice();
}
(2)Tiger,Fish,Bird类:
(2.1)Tiger类
package com.example.factory;
public class Tiger implements Animal {
@Override
public void move() {
// TODO Auto-generated method stub
System.out.println("老虎在地上跑");
}
@Override
public void voice() {
// TODO Auto-generated method stub
System.out.println("老虎发出叫声");
}
}
(2.2)Fish类
package com.example.factory;
public class Fish implements Animal {
@Override
public void move() {
// TODO Auto-generated method stub
System.out.println("鱼儿在水里游");
}
@Override
public void voice() {
// TODO Auto-generated method stub
System.out.println("鱼儿发出叫声");
}
}
(2.3)Bird类
package com.example.factory;
public class Bird implements Animal {
@Override
public void move() {
// TODO Auto-generated method stub
System.out.println("小鸟在天空飞");
}
@Override
public void voice() {
// TODO Auto-generated method stub
System.out.println("小鸟发出叫声");
}
}
(3)ForestFactory类
这里用到了一点反射的知识,什么是反射?百度百科:Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。意思就是说我能根据这个类的名字获得这个类的一个实例,通常我们用一个类对象都是new一个,现在不用了,你只要知道这个类的名字,就可以得到了。
关键代码:animal = (Animal) Class.forName(c.getName()).newInstance();//c为Class类型的一个对象
class.getName() : 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
class.forName(String s):返回与带有给定字符串名的类或接口相关联的 Class
对象。
class.newtInstance( ):创建此 Class 对象所表示的类的一个新实例。
public class ForestFactory {
public static Animal createAnimal(Class<?> c){
Animal animal = null;
try {
animal = (Animal) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return animal;
}
}
(4)生产者——God类
public class God {
public static void main(String[] args){
System.out.println("-----神创造了老虎-----");
Tiger tiger = (Tiger) ForestFactory.createAnimal(Tiger.class);
tiger.move();
tiger.voice();
System.out.println("-----神创造了小鸟-----");
Bird bird = (Bird) ForestFactory.createAnimal(Bird.class);
bird.move();
bird.voice();
System.out.println("-----神创造了鱼儿-----");
Fish fish = (Fish) ForestFactory.createAnimal(Fish.class);
fish.move();
fish.voice();
}
}
(5)打印结果:
-----神创造了老虎-----
老虎在地上跑
老虎发出叫声
-----神创造了小鸟-----
小鸟在天空飞
小鸟发出叫声
-----神创造了鱼儿-----
鱼儿在水里游
鱼儿发出叫声