抽象工厂模式

意图

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

适用性

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

结构

abstract_factory
从图上可以看出,抽象工厂模式相比工厂模式,对产品类进行了进一步的抽象,等于是每个工厂能够生产一系列产品,不同的工厂生产不同系列的产品。主要该是有三个元素,1、client(调用工厂);2、工厂类(生成者);3、产品类

代码示例

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
//工厂类
interface abstractFactory
{
public function getProductA();
public function getProductB();
}
class factoryA implements abstractFactory
{
public function getProductA()
{
return new ProductAA();
}
public function getProductB()
{
return new ProductAB();
}
}
class factoryB implements abstractFactory
{
public function getProductA()
{
return new ProductBA();
}
public function getProductB()
{
return new ProductBB();
}
}
//产品类
interface productA
{
public function getProductName();
}
interface productB
{
public function getProductName();
}
class ProductAA implements productA
{
public function getProductName()
{
echo "I am Product AA" . PHP_EOL;
}
}
class ProductAB implements productA
{
public function getProductName()
{
echo "I am Product AB" . PHP_EOL;
}
}
class ProductBA implements productB
{
public function getProductName()
{
echo "I am Product BA" . PHP_EOL;
}
}
class ProductBB implements productB
{
public function getProductName()
{
echo "I am Product BA" . PHP_EOL;
}
}
//客户端
class client
{
public static function create()
{
self::createProduct(new factoryA);
self::createProduct(new factoryB);
}
public static function createProduct($factory)
{
$productAA = $factory->getProductA();
$productAB = $factory->getProductB();
$productAA->getProductName();
$productAB->getProductName();
}
}
client::create();

特征说明

1、工厂类实现统一的接口,每个工厂类对应一个系列的产品
2、每个系列的产品实现自己系列的接口
3、每一个系列的产品都是放在一起使用的。

参考文献

1.设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
2.23种设计模式
3.PHP设计模式笔记:使用PHP实现抽象工厂模式