抽象工廠模式(Abstact Factory)是一種常見的軟件設(shè)計(jì)模式。該模式為一個(gè)產(chǎn)品族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品族的某一系列的時(shí)候,可以為此系列的產(chǎn)品族創(chuàng)建一個(gè)具體的工廠類。
一、意圖
抽象工廠模式提供一個(gè)創(chuàng)建一系統(tǒng)相關(guān)或相互依賴對象的接口,而無需指定它們具體的類【GOF95】
二、抽象工廠模式結(jié)構(gòu)圖
三、抽象工廠模式中主要角色
抽象工廠(Abstract Factory)角色:它聲明一個(gè)創(chuàng)建抽象產(chǎn)品對象的接口。通常以接口或抽象類實(shí)現(xiàn),所有的具體工廠類必須實(shí)現(xiàn)這個(gè)接口或繼承這個(gè)類。
具體工廠(Concrete Factory)角色:實(shí)現(xiàn)創(chuàng)建產(chǎn)品對象的操作。客戶端直接調(diào)用這個(gè)角色創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色包含有選擇合適的產(chǎn)品對象的邏輯。通常使用具體類實(shí)現(xiàn)。
抽象產(chǎn)品(Abstract Product)角色:聲明一類產(chǎn)品的接口。它是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。
具體產(chǎn)品(Concrete Product)角色:實(shí)現(xiàn)抽象產(chǎn)品角色所定義的接口,定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象。其內(nèi)部包含了應(yīng)用程序的業(yè)務(wù)邏輯。
四、抽象工廠模式的優(yōu)缺點(diǎn)
抽象工廠模式的優(yōu)點(diǎn):
1、分離了具體的類
2、使增加或替換產(chǎn)品族變得容易
3、有利于產(chǎn)品的一致性
抽象工廠模式的缺點(diǎn): 難以支持新種類的產(chǎn)品。這是因?yàn)锳bstractFactory接口確定了可以被創(chuàng)建的產(chǎn)品集合。支持新各類的產(chǎn)品就需要擴(kuò)展訪工廠接口,從而導(dǎo)致AbstractFactory類及其所有子類的改變。
抽象工廠就是以一種傾斜的方式支持增加新的產(chǎn)品中,它為新產(chǎn)品族的增加提供了方便,而不能為新的產(chǎn)品等級結(jié)構(gòu)的增加提供這樣的方便。
五、抽象工廠模式適用場景
以下情況應(yīng)當(dāng)使用抽象工廠模式:
1、一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對于所有形態(tài)的工廠模式都是重要的。
2、這個(gè)系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
3、 同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來。
4、系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使用客戶端不依賴于實(shí)現(xiàn)
六、抽象工廠模式與其它模式
單例模式(singleton模式):具體工廠類可以設(shè)計(jì)成單例類,由于工廠通常有一個(gè)就可以,因此具體工廠子類一般都實(shí)現(xiàn)為一個(gè)Singleton。
工廠方法模式(factory method模式):抽象工廠創(chuàng)建產(chǎn)品的方法定義為工廠方法。
原型模式(prototype模式):如果有多個(gè)可能的產(chǎn)品系列,具體的工廠也可以使用原型模式,具體工廠使用產(chǎn)品系列中
每一個(gè)產(chǎn)品的原型進(jìn)行實(shí)例化并且通過復(fù)制它的原型來創(chuàng)建新的產(chǎn)品。
七、抽象工廠模式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 { /** * 創(chuàng)建等級結(jié)構(gòu)為A的產(chǎn)品的工廠方法 */ public function createProductA(); /** * 創(chuàng)建等級結(jié)構(gòu)為B的產(chǎn)品的工廠方法 */ 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(); } } /** * 抽象產(chǎn)品A */ interface AbstractProductA { /** * 取得產(chǎn)品名 */ public function getName(); } /** * 抽象產(chǎn)品B */ interface AbstractProductB { /** * 取得產(chǎn)品名 */ public function getName(); } /** * 具體產(chǎn)品A1 */ class ProductA1 implements AbstractProductA { private $_name ; public function __construct() { $this ->_name = 'product A1' ; } public function getName() { return $this ->_name; } } /** * 具體產(chǎn)品A2 */ class ProductA2 implements AbstractProductA { private $_name ; public function __construct() { $this ->_name = 'product A2' ; } public function getName() { return $this ->_name; } } /** * 具體產(chǎn)品B1 */ class ProductB1 implements AbstractProductB { private $_name ; public function __construct() { $this ->_name = 'product B1' ; } public function getName() { return $this ->_name; } } /** * 具體產(chǎn)品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()); } /** * 調(diào)用工廠實(shí)例生成產(chǎn)品,輸出產(chǎn)品名 * @param $factory AbstractFactory 工廠實(shí)例 */ public static function run(AbstractFactory $factory ) { $productA = $factory ->createProductA(); $productB = $factory ->createProductB(); echo $productA ->getName(), '<br />' ; echo $productB ->getName(), '<br />' ; } } Client::main(); ?> |
以上就是使用php實(shí)現(xiàn)抽象工廠模式的代碼,還有一些關(guān)于抽象工廠模式的概念區(qū)分,希望對大家的學(xué)習(xí)有所幫助。