PHP設計模式 抽象工廠

2021-07-01 22:10:12 字數 3227 閱讀 6086

宣告:本系列部落格參考資料《大話設計模式》,作者程杰。

前面我們介紹了簡單工廠和工廠方法設計模式,今天我們學習最後乙個工廠——抽象工廠。

案例:追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...