php設計模式之抽象工廠

2021-08-02 02:42:30 字數 3656 閱讀 1309

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