案例:追mm少不了請吃飯了,去麥當勞,只管向服務員說「兩個b**」就行了。麥當勞就是b**的abstractfactory,b**裡含有漢堡, 雞翅和飲料. 麥當勞或肯德基會根據b**的規格, 讓漢堡factory, 雞翅factory,飲料factory分別生產對應b**的材料.
抽象工廠模式:提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。客戶類和工廠類分開。消費者任何時候需要某套產品集合時,只需向抽象工廠請求即可。抽象工廠會再向具體的工廠生產出符合產品集規格的產品.
uml類圖實現:
uml類圖**實現:
[php]view plain
copy
print?
<?php
/*** created by phpstorm.
* user: lyl
* date: 2015/4/19
* time: 17:39
*///-----------------------產品------------------------
/**抽象產品角色 充飢食物
* inte***ce iallayfood
*/inte***ce
iallayfood
/**抽象產品角色 解渴食物
* inte***ce idrinkfood
*/inte***ce
idrinkfood
/**具體產品角色 蝦仁漢堡
* class xiarenhamb
*/class
xiarenhamb
implements
iallayfood
} /**具體產品角色 雞肉漢堡
* class chickenhamb
*/class
chickenhamb
implements
iallayfood
} /**具體產品角色 可口可樂
* class kekoukele
*/class
kekoukele
implements
idrinkfood
} /**具體產品角色 百事可樂
* class baishikele
*/class
baishikele
implements
idrinkfood
} //-------------------抽象工廠---------------------
/**頂層超級抽象工廠介面
* inte***ce ifactory
*/inte***ce
ifactory
/**工廠a a**:蝦仁漢堡+百事可樂
* class iafactory
*/class
afactory
implements
ifactory
function
getdrinkfood()
} /**工廠b b**:雞肉漢堡+可口可樂
* class ibfactory
*/class
bfactory
implements
ifactory
function
getdrinkfood()
} 客戶端測試**
[php]view plain
copy
print?
header(
"content-type:text/html;charset=utf-8"
);
//------------------------抽象工廠測試**------------------
require_once
"./abstractfactory/abstractfactory.php"
; //------------------點**-------------
$factorya
=new
afactory();
$factoryb
=new
bfactory();
//------------------麥當勞製作**食物------------
//a**
$allaya
=$factorya
->getallayfood();
$drinka
=$factorya
->getdrinkfood();
//b**
$allayb
=$factoryb
->getallayfood();
$drinkb
=$factoryb
->getdrinkfood();
//-------------------享受**---------------
echo
"享受a**:
";
$allaya
->allay();
$drinka
->drink();
echo
"享受b**:
";
$allayb
->allay();
$drinkb
->drink();
當每個抽象產品都有多於乙個的具體子類的時候,工廠角色怎麼知道例項化哪乙個子類呢?比如每個抽象產品角色都有兩個具體產品。抽象工廠模式提供兩個具體工廠角色,分別對應於這兩個具體產品角色,每乙個具體工廠角色只負責某乙個產品角色的例項化。每乙個具體工廠類只負責建立抽象產品的某乙個具體子類的例項。
適用場景:
1、遊戲開發中的多風格系列場景(**),比如道路(介面),房屋,管道等。
2、系統要在三個不同平台上執行,比如windows、linux、android上執行,你會怎麼設計?通過抽象工廠模式遮蔽掉作業系統對應用的影響。三個不同作業系統上的軟體功能、應用邏輯、ui都應該是非常類似,唯一不同的是呼叫不同的工廠方法,由不同的產品類去處理與作業系統互動的資訊。
3、需要建立的物件是一系列相互關聯或相互依賴的產品族時,便可以使用抽象工廠模式。
三種工廠模式總結:
1.三種在形式和特點上極為相似,最終目的都是解耦。將物件的建立過程進行封裝,使客戶端可以直接得到物件,而不用去關心如何建立物件。
2.對比
工廠方法模式:用於建立複雜物件。(單點食物)
抽象工廠模式:用於建立一組相關或相互依賴的複雜物件。(買**)
工廠方法建立一般只有乙個方法,建立一種產品。抽象工廠一般有多個方法,建立一系列產品。
我們不必去在意模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了乙個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了,而對於抽象工廠模式,當減少乙個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
PHP設計模式 工廠模式之抽象工廠模式
abstract class 2 建立ttd 抽象類 ttd 抽象類 class ttdencoder abstract class ttdencoder 3 建立contact 抽象類 contact 抽象類 class contactencoder abstract class contacte...
php 設計模式之抽象工廠模式
抽象工廠模式 abstact factory 是一種常見的軟體設計模式。該模式為乙個產品族提供了統一的建立介面。當需要這個產品族的某一系列的時候,可以為此系列的產品族建立乙個具體的工廠類。一 意圖 抽象工廠模式提供乙個建立一系統相關或相互依賴物件的介面,而無需指定它們具體的類 gof95 二 抽象工...
設計模式之工廠模式之抽象工廠(php實現)
抽象工廠模式 先來認識下什麼是產品族 位於不同產品等級結構中,功能相關聯的產品組成的家族。圖中的bmwcar和benzcar就是兩個產品樹 產品等級結構 而如圖所示的benzsportscar和bmwsportscar就是乙個產品族。他們都可以放到跑車家族中,因此功能有所關聯。同理bmwbussin...