设计模式创建型之抽象工厂篇

1.意图

 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2.适用性

在以下情况可以使用Abstract Factory模式
• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

3.结构

此模式的结构如下图所示。

4.参与者

• A b s t r a c t F a c t o r y ( Wi d g e t F a c t o r y )

— 声明一个创建抽象产品对象的操作接口。
• C o n c r e t e F a c t o r y ( M o t i f Wi d g e t F a c t o r y,P M Wi d g e t F a c t o r y )
— 实现创建具体产品对象的操作。
• A b s t r a c t P r o d u c t ( Wi n d o w s,S c r o l l B a r )
— 为一类产品对象声明一个接口。
• C o n c r e t e P r o d u c t ( M o t i f Wi n d o w,M o t i f S c r o l l B a r )
— 定义一个将被相应的具体工厂创建的产品对象。
— 实现A b s t r a c t P r o d u c t接口。
• C l i e n t
— 仅使用由A b s t r a c t F a c t o r y和A b s t r a c t P r o d u c t类声明的接口。

5.协作

• 通常在运行时刻创建一个C o n c r e t e F a c t r o y类的实例。这一具体的工厂创建具有特定实现
的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。
• AbstractFactory将产品对象的创建延迟到它的C o n c r e t e F a c t o r y子类。

6.效果

A b s t r a c t F a c t o r y模式有下面的一些优点和缺点:
1) 它分离了具体的类Abstract Factory模式帮助你控制一个应用创建的对象的类。因为
一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象
接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
2) 它使得易于交换产品系列一个具体工厂类在一个应用中仅出现一次—即在它初始化
的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同
的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻
改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可
实现从M o t i f窗口组件转换为Presentation Manager窗口组件。
3) 它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一
次只能使用同一个系列中的对象,这一点很重要。而A b s t r a c t F a c t o r y很容易实现这一点。
4) 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为
A b s t r a c t F a c t o r y接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,
这将涉及A b s t r a c t F a c t o r y类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决
办法。

7.实现

下面是实现Abstract Factor模式的一些有用技术:
1) 将工厂作为单件一个应用中一般每个产品系列只需一个C o n c r e t e F a c t o r y的实例。因此
工厂通常最好实现为一个S i n g l e t o n(3 . 5)。
2) 创建产品A b s t r a c t F a c t o r y仅声明一个创建产品的接口,真正创建产品是由
C o n c r e t e P r o d u c t子类实现的。最通常的一个办法是为每一个产品定义一个工厂方法(参见
Factory Method(3 . 3))。一个具体的工厂将为每个产品重定义该工厂方法以指定产品。虽然
这样的实现很简单,但它却要求每个产品系列都要有一个新的具体工厂子类,即使这些产品
系列的差别很小。

如果有多个可能的产品系列,具体工厂也可以使用P r o t o t y p e(3 . 4)模式来实现。具体工
厂使用产品系列中每一个产品的原型实例来初始化,且它通过复制它的原型来创建新的产品。
在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。

3) 定义可扩展的工厂A b s t r a c t F a c t o r y通常为每一种它可以生产的产品定义一个操作。产
品的种类被编码在操作型构中。增加一种新的产品要求改变A b s t r a c t F a c t o r y的接口以及所有与
它相关的类。一个更灵活但不太安全的设计是给创建对象的操作增加一个参数。该参数指定
了将被创建的对象的种类。它可以是一个类标识符、一个整数、一个字符串,或其他任何可
以标识这种产品的东西。实际上使用这种方法, A b s t r a c t F a c t o r y只需要一个“ M a k e”操作和
一个指示要创建对象的种类的参数。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值