创建型模式--3.Abstract Factory模式(一)
Abstract Factory(抽象工厂)模式, 又称工具箱(Kit 或Toolkit)模式.(对象创建型模式)
提供一个创建一系列或相互依赖对象的接口, 而不需要指定它们具体的类.
2.1 一个系统要独立于它的产品的创建, 组合和表示时;
2.2 一个系统要有多个产品系列中的一个来配置时;
2.3 当你要强调以系列相关的产品对象的设计以便进行联合使用时;
2.4 当你提供一个产品类库, 而只想显示他们的接口而不是实现时;
图1
AbstractFactory : 声明一个创建抽象产品对象的操作接口.
ConcteteFactory: 实现创建具体产品对象的操作.
AbstractProduct: 为一类产品对象声明一个接口.
ConceteProduct: 定义一个将被相应的具体工厂创建的产品对象; 实现AbstractProduct接口.
Client: 只是用AbstractFactory和AbstractProduct类声明的接口.(从图中可以很清晰看到)
Client要创建ProductA和ProductB的V1系列, 所以客户先创建ConreteFactory1, 调用CreateProductA()和CreateProductB()来完成Product的创建.
6.1 分离了具体类: 很明显Client只是用AbstractFactory和AbstractProduct类声明的接口.
6.2 它使得易于交换产品系列: V1系列使用ConcteteFactory1工厂类创建, V2系列使用ConcteteFactory2工厂类创建.
6.3 有利于产品的一致性: V1系列使用ConcteteFactory1工厂类创建, V2系列使用ConcteteFactory2工厂类创建
6.4 难以支持新种类的产品: 因为AbstractFactory接口确定了可以被创建的产品集合.
假设现在要增加ProductC, 需要做的事情是: AbstractFactory增加接口CreateProductC(), 那么所有AbstractFactory的子类都要增加函数CreateProductC().
7.1 从图1中看出ConcteteFactory1创建ProductA_V1和ProductB_V1; ConcteteFactory2创建ProductA_V2和ProductB_V2
7.2 ProductA_V1, ProductA_V2, ProductB_V1, ProductB_V2的组合只有ProductA_V1与ProductB_V1 和 ProductA_V2与ProductB_V2 这两种组合才是有效组合.
7.3 Client需要用的ProductA和ProductB必须都要生成, 而且A和B的系列号必须相同, 才适合使用Abstract Factory.模式
7.4 如果增加V3系列, 那么只需要增加ProductA_V3, ProductB_V3和,ConcteteFactory3 三个子类, Client修改的代码只是在创建工厂类的地方改为创建ConcteteFactory3 的对象即可.
7.5 我觉得6.4与7.4最难区分和理解.
Abstract Factory模式通常可以使用Factory Method模式实现(CreateProductA就是工厂方法了, CreateProductB也是工厂方法.), 也可以使用Prototype模式实现.
一个具体的工厂类通常就是一个Singleton(模式了).