抽象工厂模式(Abstract Factory Pattern)提供一个抽象接口,能够创建一组相关或者相互依赖的对象。接口负责创建一个相关对象的工厂,不需要知道具体的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
优点:

  • 具体产品在应用层代码隔离,无需关心创建细节;
  • 将一个系列的产品族统一到一起创建。

缺点:

  • 扩展新产品困难,需要修改抽象工厂的接口;
  • 增加系统的抽象性和理解难度
  • 开闭原则的倾斜性,对于新增加产品族,只要增加具体产品和工厂,无序修改内部代码,这很好地支持了开闭原则,但是对于新增加产品等级结构,也就是扩展新的产品,需要修改工厂内部代码,甚至修改抽象层的代码,这就违反了开闭原则。

使用场景:

  • 客户端或应用层不依赖于产品类实例是如何被创建、如何被实现的;
  • 一系列相关产品对象(同一个产品族)一起使用创建对象需要大量重复的代码;
  • 提供一个产品类的库,所有的产品以同样的接口出现,是的客户端或应用层不依赖于具体实现。
  • 例如:1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
  • 抽象工厂模式 - 图1

    实现

    我们将创建 ShapeColor 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactoryColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer
    AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE),以便获取它所需对象的类型。
    抽象工厂模式 - 图2