Version: Next

抽象工厂模式 Abstract Factory

源发问题

系统由不同类型的对象构成,每种类型下又可分为不同型号。系统在建立时,从每种类型中选择一种型号对象进行创建;对于多种组合创建而言,希望能用统一的方式来操作。

解决方案

AbstractProductA、AbstractProductB为抽象类,代表两类产品类型,他们分别派生了相应的具体型号产品。AbstractFactory为抽象工程,规定了组合创建产品的统一接口,创建的过程在具体工厂当中完成,图中用依赖关系表示具体工厂对具体产品的创建。Client为客户端调用代码,它只与抽象工厂和抽象产品类存在关联关系,代表了客户端针对抽象类接口进行编程,即通过抽象工厂类的声名引用具体工厂来组合创建产品,创建的具体产品也被对应的抽象产品类的声名引用。

系统是由对象构成的,当系统扩展时,必然需要融入新的对象。如果能在创建新对象的同时又不需要对原系统代码进行修改就是创建型模式需要解决的主要问题。然而解决方案并不唯一,因为对象的创建、装配、使用的不同的应用环境中要求不同,对这些要求进行归类,就形成了多种创建对象的模式。

开闭原则、组合/聚合原则在创建型模式中的抽象工厂、生成器、原型模式中应用,使原有系统在不用改变代码的情况下能够产生新对象的要求

  1. 抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象簇,而无需指明具体类
  2. 抽象工厂模式可以将简单工厂模式工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)
  4. 将工厂抽象为两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单工厂类编程工厂簇,更利于代码的维护和扩展。

UML类图

img

tip

Client中的代码不能做任何修改

Client接触的都是抽象类,看不到具体类,以此利用抽象类的可替换性和多态性,实现开闭原则

代码

优缺点

  • 优点
    • 满足开闭原则,可以添加新的型号
  • 缺点
    • 不能添加新的类型,只能为现有类型添加新的型号