1.为什么要使用工厂模式
在网上看了很多篇文章,都说工厂模式华而不实,但是Spring容器中却大量了使用工厂模式,比如BeanFactory等,下面这篇文章分析的或许有点道理:
http://blog.csdn.net/lovelion/article/details/7523392
依博主个人而言,工厂模式主要是用来管理的作用的。有的接口有很多很多实现类,为了方便它们的创建和统一管理,工厂模式应运而生。
2.先上波类图
现在通常会把工厂模式分成3种,但是究其思想,就是越来越抽象而已,越抽象就代表着其扩展性越强。所以直接分析最抽象的 抽象工厂模式
讲解一下这个类图,首先有个Human接口,它有两个实现类,黑种人和黄种人,(为了方便,白种人就不写了)。我们的目的就是通过工厂去造人,而不是直接 new YellowHuamn();
接下来就是工厂模式的类图了,先看一下AbstractHumanFactory,这是一个抽象工厂,它宣称它会createHuman(Class<T>),基于这个抽象工厂,我们可以给他实例化很多工厂,例如(儿童工厂,成人工厂,老人工厂),为了方便起见,只写了一个人类工厂HumanFactory,并实现了它的createHuman(Class<T>)功能。
然后就是God了,上帝通过AbstractHumanFactory(抽象工厂)创造人类,上帝只要对这个抽象工厂说,我要造一个黄种人的儿童,那么我们在main方法中就可以把上帝的AbstractHumanFactory成员,实例化成儿童工厂,再通过这个儿童工厂去造一个黄种人。
由此可见,工厂模式实际上就是让上层方便管理下层,一级级下去,每一层负责实现自己的功能就行了。
3.工厂模式的实现:
Human和它的实现类
//方便起见,把相关功能的类放在同一个代码块中
public interface Human {
void run();
void speak();
}
public class BlackHuman implements Human{
@Override
public void run() {
System.out.println("black run");
}
@Override
public void speak() {
System.out.println("black run");
}
}
public class YellowHuman implements Human{
@Override
public void run() {
System.out.println("yellow run");
}
@Override
public void speak() {
System.out.println("yellow speak");
}
}
工厂和它的实现类
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> t);
}
public class HumanFactory extends AbstractHumanFactory{
@Override
public <T extends Human> T createHuman(Class<T> clazz) {
if(clazz == YellowHuman.class){
return (T) new YellowHuman();
}else if (clazz == BlackHuman.class){
return (T) new BlackHuman();
}else {
throw new RuntimeException("不支持的人种类型");
}
}
}
God和Main方法
public class God {
private AbstractHumanFactory humanFactory;
public God(AbstractHumanFactory humanFactory) {
this.humanFactory = humanFactory;
}
public AbstractHumanFactory getHumanFactory() {
return humanFactory;
}
}
public class Main {
public static void main(String[] args) {
AbstractHumanFactory humanFactory = new HumanFactory();
God god = new God(humanFactory);
//通过工厂创建人
YellowHuman human = god.getHumanFactory().createHuman(YellowHuman.class);
human.run();
human.speak();
}
}
以上就是通过工厂模式来创建对象,当然也可以直接new 对象,但是在大型框架中,为了方便管理,还是会使用工厂模式。