抽象工厂模式(Abstract Factory Pattern)提供一个抽象接口,能够创建一组相关或者相互依赖的对象。接口负责创建一个相关对象的工厂,不需要知道具体的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
优点:
- 具体产品在应用层代码隔离,无需关心创建细节;
- 将一个系列的产品族统一到一起创建。
缺点:
- 扩展新产品困难,需要修改抽象工厂的接口;
- 增加系统的抽象性和理解难度
- 开闭原则的倾斜性,对于新增加产品族,只要增加具体产品和工厂,无序修改内部代码,这很好地支持了开闭原则,但是对于新增加产品等级结构,也就是扩展新的产品,需要修改工厂内部代码,甚至修改抽象层的代码,这就违反了开闭原则。
使用场景:
- 客户端或应用层不依赖于产品类实例是如何被创建、如何被实现的;
- 一系列相关产品对象(同一个产品族)一起使用创建对象需要大量重复的代码;
- 提供一个产品类的库,所有的产品以同样的接口出现,是的客户端或应用层不依赖于具体实现。
- 例如:1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
-
实现
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。
AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。