抽象工厂模式


抽象工厂模式


  • 抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。(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产品。从这一点上看,抽象工厂模式符合开闭原则。

原文地址:https://www.cnblogs.com/zhanglei93/p/6014899.html