您的位置:首页 > 其它

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

2013-08-09 11:14 344 查看
 创建型模式--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(模式了).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: