宣告:本系列部落格參考資料《大話設計模式》,作者程杰。
前面我們介紹了簡單工廠和工廠方法設計模式,今天我們學習最後乙個工廠——抽象工廠。
案例:追mm少不了請吃飯了,去麥當勞,只管向服務員說「兩個b**」就行了。麥當勞就是b**的abstractfactory,b**裡含有漢堡, 雞翅和飲料. 麥當勞或肯德基會根據b**的規格, 讓漢堡factory, 雞翅factory,飲料factory分別生產對應b**的材料.
抽象工廠模式:提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。客戶類和工廠類分開。消費者任何時候需要某套產品集合時,只需向抽象工廠請求即可。抽象工廠會再向具體的工廠生產出符合產品集規格的產品.
uml類圖實現:
uml類圖**實現:
<?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()
}
客戶端測試**
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物件導向設計模式
PHP設計模式 抽象工廠
在學習過工廠方法之後,我所了解的工廠方法基本是去建立乙個物件,例如在玩遊戲的時候,建立了乙個關羽英雄,乙個張飛英雄這樣。但是有時候程式設計時可能需要建立一組物件,這就出現了第二種建立型設計模式 抽象工廠方法 abstractfactory 比方說,我在建立關羽的時候手上拿著青龍偃月刀,騎著赤兔馬。建...
PHP 設計模式 抽象工廠
抽象工廠模式 abstract factory pattern 是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式...
PHP設計模式 工廠模式之抽象工廠模式
abstract class 2 建立ttd 抽象類 ttd 抽象類 class ttdencoder abstract class ttdencoder 3 建立contact 抽象類 contact 抽象類 class contactencoder abstract class contacte...