抽象工廠模式(Abstact Factory)是一種常見的軟件設計模式。該模式為一個產品族提供了統一的創建接口。當需要這個產品族的某一系列的時候,可以為此系列的產品族創建一個具體的工廠類。
一、意圖
抽象工廠模式提供一個創建一系統相關或相互依賴對象的接口,而無需指定它們具體的類【GOF95】
二、抽象工廠模式結構圖
三、抽象工廠模式中主要角色
抽象工廠(Abstract Factory)角色:它聲明一個創建抽象產品對象的接口。通常以接口或抽象類實現,所有的具體工廠類必須實現這個接口或繼承這個類。
具體工廠(Concrete Factory)角色:實現創建產品對象的操作。客戶端直接調用這個角色創建產品的實例。這個角色包含有選擇合適的產品對象的邏輯。通常使用具體類實現。
抽象產品(Abstract Product)角色:聲明一類產品的接口。它是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。
具體產品(Concrete Product)角色:實現抽象產品角色所定義的接口,定義一個將被相應的具體工廠創建的產品對象。其內部包含了應用程序的業務邏輯。
四、抽象工廠模式的優缺點
抽象工廠模式的優點:
1、分離了具體的類
2、使增加或替換產品族變得容易
3、有利于產品的一致性
抽象工廠模式的缺點: 難以支持新種類的產品。這是因為AbstractFactory接口確定了可以被創建的產品集合。支持新各類的產品就需要擴展訪工廠接口,從而導致AbstractFactory類及其所有子類的改變。
抽象工廠就是以一種傾斜的方式支持增加新的產品中,它為新產品族的增加提供了方便,而不能為新的產品等級結構的增加提供這樣的方便。
五、抽象工廠模式適用場景
以下情況應當使用抽象工廠模式:
1、一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有形態的工廠模式都是重要的。
2、這個系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
3、 同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
4、系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使用客戶端不依賴于實現
六、抽象工廠模式與其它模式
單例模式(singleton模式):具體工廠類可以設計成單例類,由于工廠通常有一個就可以,因此具體工廠子類一般都實現為一個Singleton。
工廠方法模式(factory method模式):抽象工廠創建產品的方法定義為工廠方法。
原型模式(prototype模式):如果有多個可能的產品系列,具體的工廠也可以使用原型模式,具體工廠使用產品系列中
每一個產品的原型進行實例化并且通過復制它的原型來創建新的產品。
七、抽象工廠模式PHP示例
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
<?php /** * 抽象工廠 */ interface AbstractFactory { /** * 創建等級結構為A的產品的工廠方法 */ public function createProductA(); /** * 創建等級結構為B的產品的工廠方法 */ public function createProductB(); } /** * 具體工廠1 */ class ConcreteFactory1 implements AbstractFactory{ public function createProductA() { return new ProductA1(); } public function createProductB() { return new ProductB1(); } } /** * 具體工廠2 */ class ConcreteFactory2 implements AbstractFactory{ public function createProductA() { return new ProductA2(); } public function createProductB() { return new ProductB2(); } } /** * 抽象產品A */ interface AbstractProductA { /** * 取得產品名 */ public function getName(); } /** * 抽象產品B */ interface AbstractProductB { /** * 取得產品名 */ public function getName(); } /** * 具體產品A1 */ class ProductA1 implements AbstractProductA { private $_name ; public function __construct() { $this ->_name = 'product A1' ; } public function getName() { return $this ->_name; } } /** * 具體產品A2 */ class ProductA2 implements AbstractProductA { private $_name ; public function __construct() { $this ->_name = 'product A2' ; } public function getName() { return $this ->_name; } } /** * 具體產品B1 */ class ProductB1 implements AbstractProductB { private $_name ; public function __construct() { $this ->_name = 'product B1' ; } public function getName() { return $this ->_name; } } /** * 具體產品B2 */ class ProductB2 implements AbstractProductB { private $_name ; public function __construct() { $this ->_name = 'product B2' ; } public function getName() { return $this ->_name; } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { self::run( new ConcreteFactory1()); self::run( new ConcreteFactory2()); } /** * 調用工廠實例生成產品,輸出產品名 * @param $factory AbstractFactory 工廠實例 */ public static function run(AbstractFactory $factory ) { $productA = $factory ->createProductA(); $productB = $factory ->createProductB(); echo $productA ->getName(), '<br />' ; echo $productB ->getName(), '<br />' ; } } Client::main(); ?> |
以上就是使用php實現抽象工廠模式的代碼,還有一些關于抽象工廠模式的概念區分,希望對大家的學習有所幫助。