抽象工厂模式
-
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。(Provide an interface for creating families of related or dependent objects without specifying their concrete classes).
-
抽象工厂模式是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。抽象工厂的通用类图如下:
-
我们通过抽象工厂的通用类图和源码对该模式做进一步的说明,首先通用源码类图如下:
public static void main(String[] args){ AbstractCreator creator1 = new Creator1(); AbstractCreator creator2 = new Creator2(); AbstractProductA a1 = creator1.CreateProductA(); AbstractProductA a2 = creator2.CreateProductA(); AbstractProductB b1 = creator1.CreateProductB(); AbstractProductB b2 = creator2.CreateProductB(); }
在场景类中,没有一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接产生一个产品对象,无需关心它的实现类。
-
抽象工厂模式的优点
- 封装性:每个产品的实现类不是高层模块要关心的,高层模块需要关心的是接口,是抽象,它不关心对象是如何创建的,只要知道工厂类是谁,就能创建出一个需要的对象,省时省力。
- 产品族内为非公开状态,例如在生产a1和a2比例问题上,如生产一个a1就要相应的生产一个a2,这样的生产过程对调用工厂的高层模块来说是透明的,具体的产品族内的约束是在工厂内实现的。
-
抽象工厂模式的缺点
抽象工厂模式最大的缺点就是产品族扩展困难,如上例,我们要增加ProductC,则首先抽象工厂中的AbstractCreator中需要增加CreateProductC()方法,然后两个实现类Creator1和Creator2中都需要修改,这违反了开闭原则。
-
抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或者一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软实体,但是Linux和windows下的界面相同,但是代码实现不同,也就是有了共同的约束条件:操作系统类型,此种场景下可以使用抽象工厂模式,产生不同操作系统下的文本编辑器和图片处理器。
-
抽象工厂模式的注意事项
在抽象工厂模式缺点中,提到抽象工厂模式的产品族扩展比较困难,而不是产品等级。在该模式下,产品等级扩展非常容易,增加一个产品等级,只需要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展难。如上例,我们给A和B产品分别增加子产品A3和B3,则只需要增加A3和B3的实现类,以及增加一个Creator3工厂类负责创建新增加的A3和B3产品。从这一点上看,抽象工厂模式符合开闭原则。