设计模式(2) 创建型模式 ABSTRACT FACTORY 抽象工厂模式

目录

本节关于ABSTRACT FACTORY 抽象工厂模式 —— 对象创建模式

1. 意图

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

2. 别名

Kit

3. 动机

简单工厂——当你需要什么,只需要传入相应参数就能获得对象,但无须知道其创建细节。

如下图,支持多种视图标准的用户界面工具包,例如Motif和Presenation Manager。不同视感(look-and-feel)风格为诸如滚动条、窗口、按钮等用户界面“窗口组件”定义不同的外观和行为。

问题:要求视感风格标准间可移植;一个应用不应该为一个特定的视感外观直接编码其窗口组件;整个应用中实例化特定视感风格的窗口组件类使得以后很难改变视感风格。

如下图解决该问题

定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类实现窗口组件的特定视感风格。

体现原则:单一职责SRP、开闭原则OCP

4. 适用性

  • 一个系统要独立于它的产品的创建、组合、表示
  • 一个系统要由多个产品系列中的一个来配置
  • 要强调一系列相关产品对象的设计以便联合使用
  • 提供一个产品类库,但只想显示它们的接口而不是实现

5. 结构

上图拓展

6. 参与者

  • AbstractFactory (WidgetFactory)

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

    • ConcreteFactory(MotifWidgetFactory, PMWidgetFactory)

      • 实现创建具体产品对象的操作
  • AbstractProduct(Window, ScrollBar)
    • 为一类产品对象声明一个接口
  • ConcreteProduct(MotifWindow, MotifScrollBar)
    • 定义一个将被相应的具体工厂创建的产品对象
    • 实现AbstractProduct接口
  • Client
    • 仅使用由AbstractFactory和AbstractProduct类声明的接口

7. 协作

  • 在运行时刻创建一个ConcreteFactory类的实例。这一具体工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。
  • AbstractFactory将产品对象的创建延迟到其ConcreteFactory子类

8. 效果

  • 优点

    1. 分离了具体的类

    2. 易于交换产品系列

    3. 有利于产品的一致性

  • 缺点

    1. 难以支持新种类的产品。AbstractFactory接口确定了可以被创建的产品集合,新 种类产品需要扩展该工厂接口,这会导致AbstractFactory类及其所有子类的改变。下一节会说解决方法。

9. 实现

  • 将工厂作为单件
  • 创建产品
  • 定义可扩展的工厂

10. 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class FactoryExample {

public class ComponentA
{
public void main(ICardFactory cardfactory) throws Exception{
IPaymentcard mastercard = cardfactory.createCard("debit");
boolean checkValidity = mastercard.CheckValidity();
}
}

public interface ICardFactory {
IPaymentcard createCard(String cardType) throws Exception;
}

public class GeneralFactory implements ICardFactory{
public IPaymentcard createCard(String cardtype) throws Exception{
switch(cardtype){
case "debit":
return new DebitCard();
case "credit":
return new CreditCard();
default:
throw new Exception("Card type not found");
}
}
}

public interface IPaymentcard
{
boolean CheckValidity();
IPaymentcard requestNewCard();
}



public class DebitCard implements IPaymentcard
{

@Override
public boolean CheckValidity() {
// TODO Auto-generated method stub
return false;
}

@Override
public IPaymentcard requestNewCard() {
// TODO Auto-generated method stub
return null;
}

}

public class CreditCard implements IPaymentcard
{

@Override
public boolean CheckValidity() {
// TODO Auto-generated method stub
return false;
}

@Override
public IPaymentcard requestNewCard() {
// TODO Auto-generated method stub
return null;
}

}
}

11. 应用

12. 相关模式

0%