[设计模式笔记]一. 创建型模式--3.Abstract Factory模式(一)

 创建型模式--3.Abstract Factory模式(一)


Abstract Factory(抽象工厂)模式又称工具箱(Kit Toolkit)模式.(对象创建型模式)


一. 意图


提供一个创建一系列或相互依赖对象的接口而不需要指定它们具体的类.


二. 适用性


2.1 一个系统要独立于它的产品的创建组合和表示时;

2.2 一个系统要有多个产品系列中的一个来配置时;

2.3 当你要强调以系列相关的产品对象的设计以便进行联合使用时;

2.4 当你提供一个产品类库而只想显示他们的接口而不是实现时;


三. 模式结构


[设计模式笔记]一. 创建型模式--3.Abstract Factory模式(一)_第1张图片

图1


四. 角色说明


AbstractFactory : 声明一个创建抽象产品对象的操作接口.

ConcteteFactory: 实现创建具体产品对象的操作.

AbstractProduct: 为一类产品对象声明一个接口.

ConceteProduct: 定义一个将被相应的具体工厂创建的产品对象实现AbstractProduct接口.

Client: 只是用AbstractFactoryAbstractProduct类声明的接口.(从图中可以很清晰看到)

五. 使用


Client要创建ProductAProductBV1系列所以客户先创建ConreteFactory1, 调用CreateProductA()CreateProductB()来完成Product的创建.


六. 优缺点


6.1 分离了具体类很明显Client只是用AbstractFactoryAbstractProduct类声明的接口.

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_V1ProductB_V1; ConcteteFactory2创建ProductA_V2ProductB_V2

7.2 ProductA_V1, ProductA_V2, ProductB_V1, ProductB_V2的组合只有ProductA_V1ProductB_V1 和 ProductA_V2ProductB_V2 这两种组合才是有效组合.

7.3 Client需要用的ProductAProductB必须都要生成而且AB的系列号必须相同才适合使用Abstract Factory.模式

7.4 如果增加V3系列那么只需要增加ProductA_V3, ProductB_V3,ConcteteFactory3 三个子类, Client修改的代码只是在创建工厂类的地方改为创建ConcteteFactory3 的对象即可.

7.5 我觉得6.47.4最难区分和理解.


八. 相关模式


Abstract Factory模式通常可以使用Factory Method模式实现(CreateProductA就是工厂方法了, CreateProductB也是工厂方法.), 也可以使用Prototype模式实现.

一个具体的工厂类通常就是一个Singleton(模式了).


你可能感兴趣的:([设计模式笔记]一. 创建型模式--3.Abstract Factory模式(一))