Abstract Factory

抽象工厂:

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

适用性

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

结构

Abstract Factory UML
Abstract Factory UML

AbstractFactory - 声明一个创建抽象产品对象的操作接口。
ConcreteFactory - 实现创建具体产品对象的操作。
AbstractProduct - 为一类产品对象声明一个接口
ConcreteProduct - 定义一个将被相应的具体工厂创建的产品对象。实现AbstractProduct接口。
Client - 仅使用由AbstractFactory和AbstractProduct类声明的接口。

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

示例代码

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
//---------------------------------------------------
class AbstractProductA{};
//---------------------------------------------------
class ProductA1 : public AbstractProductA
{
public:
ProductA1() : AbstractProductA()
{
std::cout<<"I'm ProductA1."<<std::endl;
}
};
//---------------------------------------------------
class ProductA2 : public AbstractProductA
{
public:
ProductA2() : AbstractProductA()
{
std::cout<<"I'm ProductA2."<<std::endl;
}
};
//---------------------------------------------------
class AbstractProductB{};
//---------------------------------------------------
class ProductB1 : public AbstractProductB
{
public:
ProductB1() : AbstractProductB()
{
std::cout<<"I'm ProductB1."<<std::endl;
}
};
//---------------------------------------------------
class ProductB2 : public AbstractProductB
{
public:
ProductB2() : AbstractProductB()
{
std::cout<<"I'm ProductB2."<<std::endl;
}
};
//---------------------------------------------------
class AbstractFactory
{
public:
virtual AbstractProductA* create_product_A() = 0;
virtual AbstractProductB* create_product_B() = 0;
};
//---------------------------------------------------
class ConcreteFactory1 : public AbstractFactory
{
public:
virtual AbstractProductA* create_product_A()
{

return new ProductA1();
}
virtual AbstractProductB* create_product_B()
{

return new ProductB1();
}
};
//---------------------------------------------------
class ConcreteFactory2 : public AbstractFactory
{
public:
virtual AbstractProductA* create_product_A()
{

return new ProductA2();
}
virtual AbstractProductB* create_product_B()
{

return new ProductB2();
}
};
//---------------------------------------------------
class Client
{
public:
Client()
{
m_factory = NULL;
m_productA = NULL;
m_productB = NULL;
}
~Client() {clear();}
public:
void clear()
{

if (m_factory) delete m_factory;
m_factory = NULL;
if (m_productA) delete m_productA;
m_productA = NULL;
if(m_productB) delete m_productB;
m_productB = NULL;
}
void test1()
{

clear();
m_factory = new ConcreteFactory1();
m_productA = m_factory->create_product_A();
m_productB = m_factory->create_product_B();
}
void test2()
{

clear();
m_factory = new ConcreteFactory2();
m_productA = m_factory->create_product_A();
m_productB = m_factory->create_product_B();
}
public:
AbstractFactory* m_factory;
AbstractProductA* m_productA;
AbstractProductB* m_productB;
};
//---------------------------------------------------
int main()
{

Client c;
c.test1();
c.test2();
system("Pause");
}

相关模式

  • AbstractFactory类通常用Factory Method实现,也可以用Prototype实现。
  • 一个具体的工厂通常是一个Singleton。

[1] 设计模式:可复用面向对象软件的基础
[2] Head First 设计模式