工厂方法模式
手机厂造手机,肥皂厂造肥皂,药品厂造药品。
假设有一大类对象A1,A2,A3,A4…他们都有一个共同的父类A
A1可以想成是手机,A2可以想成肥皂…
(下面例子的A1Factory就是手机厂,A2Factory就是肥皂厂)
那么如何利用工厂方法模式创建这些对象呢?看个例子
1、定义一个工厂的接口以及返回实体的方法
interface Factory{// 定义一个方法,返回AA create();
}
2、针对每个对象,定义创建他们的工厂,每个工厂都实现第一步的工厂接口
class A1Factory implement Factory{// A1的工厂类,返回A1对象,用A引用返回出来public A creat(){return new A1();}
}
class A2Factory implement Factory{// A2的工厂类,返回A2对象,也用A引用返回出来public A creat(){return new A2();}
}
A3、A4类似
3、使用的时候
看到下面这个效果,大概就能明白什么意思了吧,由工厂的父类,创建出对象,也用对应的父类A来接。那就相当于屏蔽了子类的差异,只要源头上换个工厂,那么返回的A就是对应工厂里面的产生的A的子类对象。
public A getObj(Factory f){return f.create();
}main(){// 给手机工厂,出来就是手机对象A A1 = getObj(new A1Factory());// 给肥皂工厂,出来就是肥皂对象A A2 = getObj(new A2Factory());
}
优缺点
很明显,工厂方法模式,创建每个对象都需要给他再创建一个对应的工厂类。这既是优点,又是缺点。
说优点,是因为这样做,相比较简单工厂来说,是把类的实例化延迟到了子类工厂上。
说缺点,是因为这样做,每次有新的类型,都要创建对应的工厂,感觉很冗余。
扩展
经常在工厂方法模式的各个子类工厂中,再使用简单工厂模式。
也就是说A1Factory的create方法,不一定只返回A1,可能还是A1的某个子类,至于具体是哪个,可以给create方法加个type入参,根据type的不同去区分。
总之就是这么个意思,就是实际生产中,很多情况下都是多个设计模式一起用,并不是只用某个设计模式。