一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 學習php設計模式 php實現抽象工廠模式

學習php設計模式 php實現抽象工廠模式

2020-12-04 14:42胖胖 PHP教程

這篇文章主要介紹了php設計模式中的抽象工廠模式,使用php實現抽象工廠模式,感興趣的小伙伴們可以參考一下

抽象工廠模式(Abstact Factory)是一種常見的軟件設計模式。該模式為一個產品族提供了統一的創建接口。當需要這個產品族的某一系列的時候,可以為此系列的產品族創建一個具體的工廠類。
一、意圖
抽象工廠模式提供一個創建一系統相關或相互依賴對象的接口,而無需指定它們具體的類【GOF95】
二、抽象工廠模式結構圖

學習php設計模式 php實現抽象工廠模式

三、抽象工廠模式中主要角色
抽象工廠(Abstract Factory)角色:它聲明一個創建抽象產品對象的接口。通常以接口或抽象類實現,所有的具體工廠類必須實現這個接口或繼承這個類。
具體工廠(Concrete Factory)角色:實現創建產品對象的操作。客戶端直接調用這個角色創建產品的實例。這個角色包含有選擇合適的產品對象的邏輯。通常使用具體類實現。
抽象產品(Abstract Product)角色:聲明一類產品的接口。它是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。
具體產品(Concrete Product)角色:實現抽象產品角色所定義的接口,定義一個將被相應的具體工廠創建的產品對象。其內部包含了應用程序的業務邏輯。
四、抽象工廠模式的優缺點
抽象工廠模式的優點:
1、分離了具體的類
2、使增加或替換產品族變得容易
3、有利于產品的一致性
抽象工廠模式的缺點: 難以支持新種類的產品。這是因為AbstractFactory接口確定了可以被創建的產品集合。支持新各類的產品就需要擴展訪工廠接口,從而導致AbstractFactory類及其所有子類的改變。
抽象工廠就是以一種傾斜的方式支持增加新的產品中,它為新產品族的增加提供了方便,而不能為新的產品等級結構的增加提供這樣的方便。
五、抽象工廠模式適用場景
以下情況應當使用抽象工廠模式:
1、一個系統不應當依賴于產品類實例如何被創建、組合和表達的細節,這對于所有形態的工廠模式都是重要的。
2、這個系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
3、 同屬于同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
4、系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使用客戶端不依賴于實現
六、抽象工廠模式與其它模式
單例模式(singleton模式):具體工廠類可以設計成單例類,由于工廠通常有一個就可以,因此具體工廠子類一般都實現為一個Singleton。
工廠方法模式(factory method模式):抽象工廠創建產品的方法定義為工廠方法。
原型模式(prototype模式):如果有多個可能的產品系列,具體的工廠也可以使用原型模式,具體工廠使用產品系列中
每一個產品的原型進行實例化并且通過復制它的原型來創建新的產品。
七、抽象工廠模式PHP示例

php" id="highlighter_184440">
?
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實現抽象工廠模式的代碼,還有一些關于抽象工廠模式的概念區分,希望對大家的學習有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一级视频在线观看 | 大片毛片女女女女女女女 | 国产麻豆在线观看网站 | 亚洲精品电影天堂网 | 鬼吹灯天星术在线高清观看 | 午夜办公室 | 99精品国产高清自在线看超 | 免费永久视频 | 国内亚州视频在线观看 | 亚洲性网| 亚洲四虎在线 | 国产欧美日韩综合二区三区 | 国模李丽莎大尺度啪啪 | 日本大学生xxxxx69泡妞 | 欧美日日操| 亚洲天堂视频在线免费观看 | 日韩在线成人 | 无码射肉在线播放视频 | 香蕉在线精品亚洲第一区 | 色女阁 | 无耻三级在线观看 | 色婷婷综合久久久 | 极品蜜桃臀美女啪啪 | 羞羞色男人的天堂伊人久久 | 亚洲精品国产SUV | 国产播放器一区 | 亚洲国产综合久久久无码色伦 | 午夜深情在线观看免费 | 69老司机亚洲精品一区 | 国产成人www免费人成看片 | 天天综合色天天综合网 | 国产一区二区三区水野朝阳 | 精品国产福利一区二区在线 | 亚洲国产成人久久77 | 91po国产在线高清福利 | xxxx意大利xxxxhd | 亚洲成人影院在线 | 久久高清一级毛片 | 国产精品性视频免费播放 | 亚洲福利天堂网福利在线观看 | 久久视频这有精品63在线国产 |