zoukankan      html  css  js  c++  java
  • 抽象工厂模式


    抽象工厂模式


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

  • 相关阅读:
    【leetcode】92. 反转链表 II
    【leetcode】91. 解码方法
    【leetcode】89. 格雷编码
    【leetcode】86. 分隔链表
    【leetcode】82. 删除排序链表中的重复元素 II
    为什么选择react
    React 全家桶实现后台管理界面
    前后端同构
    浅谈React前后端同构防止重复渲染
    由React引发的前后端分离架构的思考
  • 原文地址:https://www.cnblogs.com/zhanglei93/p/6014899.html
Copyright © 2011-2022 走看看