php 設計模式之抽象工廠模式

2021-10-16 16:58:57 字數 3430 閱讀 2563

抽象工廠模式(abstact factory)是一種常見的軟體設計模式。該模式為乙個產品族提供了統一的建立介面。當需要這個產品族的某一系列的時候,可以為此系列的產品族建立乙個具體的工廠類。

一、意圖

抽象工廠模式提供乙個建立一系統相關或相互依賴物件的介面,而無需指定它們具體的類【gof95】

二、抽象工廠模式結構圖

三、結合乙個簡單的例子了解

用種蔬菜的例子來說明事實,最初的時候,由於規模小,只種植一種蔬菜,根菜類蔬菜,這個時候由於種植方式比較簡單,採用簡單工廠模式即可,主要目的是讓工人輕鬆,下達工廠種植即可,但是隨著種植廠的發展以及市場的需求,要增加一種蔬菜型別種植了,莖菜,由於莖菜與根菜種植方式不一致,就需要兩個專門的種植工廠來進行管理,那麼久採用工廠模式來管理,乙個工廠負責一種作物的種植,這個時候產品可以理解為仍然在乙個層次。但是隨著科技的發展,我們逐步要種植轉基因與非轉基因食品了,在以前的蔬菜種類上又增加了乙個層次,這個時候無法將其作為乙個層次來解決,所以必須採用抽象工廠的方式來解決。我用uml圖表示三種結構:

四、抽象工廠模式中主要角色

抽象工廠(abstract factory)角色:它宣告乙個建立抽象產品物件的介面。通常以介面或抽象類實現,所有的具體工廠類必須實現這個介面或繼承這個類。

具體工廠(concrete factory)角色:實現建立產品物件的操作。客戶端直接呼叫這個角色建立產品的例項。這個角色包含有選擇合適的產品物件的邏輯。通常使用具體類實現。

抽象產品(abstract product)角色:宣告一類產品的介面。它是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。

具體產品(concrete product)角色:實現抽象產品角色所定義的介面,定義乙個將被相應的具體工廠建立的產品物件。其內部包含了應用程式的業務邏輯。

五、抽象工廠模式的優缺點

抽象工廠模式的優點:

1、分離了具體的類

2、使增加或替換產品族變得容易

3、有利於產品的一致性

抽象工廠模式的缺點: 難以支援新種類的產品。這是因為abstractfactory介面確定了可以被建立的產品集合。支援新各類的產品就需要擴充套件訪工廠介面,從而導致abstractfactory類及其所有子類的改變。

抽象工廠就是以一種傾斜的方式支援增加新的產品中,它為新產品族的增加提供了方便,而不能為新的產品等級結構的增加提供這樣的方便。

六、抽象工廠模式適用場景

以下情況應當使用抽象工廠模式:

1、乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有形態的工廠模式都是重要的。

2、這個系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。

3、 同屬於同乙個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

4、系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使用客戶端不依賴於實現

七、抽象工廠模式與其它模式

單例模式(singleton模式):具體工廠類可以設計成單例類,由於工廠通常有乙個就可以,因此具體工廠子類一般都實現為乙個singleton。

工廠方法模式(factory method模式):抽象工廠建立產品的方法定義為工廠方法。

原型模式(prototype模式):如果有多個可能的產品系列,具體的工廠也可以使用原型模式,具體工廠使用產品系列中

每乙個產品的原型進行例項化並且通過複製它的原型來建立新的產品。

八、抽象工廠模式php示例

<?php 

/** * 抽象產品a

*/inte***ce abstractproducta

/** * 抽象產品b

*/inte***ce abstractproductb

/** * 具體產品a1

*/class producta1 implements abstractproducta

public function getname()

}/**

* 具體產品a2

*/class producta2 implements abstractproducta

public function getname()

}/**

* 具體產品b1

*/class productb1 implements abstractproductb

public function getname()

}/**

* 具體產品b2

*/class productb2 implements abstractproductb

public function getname()

}/**

* 抽象工廠

*/inte***ce abstractfactory

/** * 具體工廠1

*/class concretefactory1 implements abstractfactory

public function createproductb()

}/**

* 具體工廠2

*/class concretefactory2 implements abstractfactory

public function createproductb()

}/**

* 客戶端

*/class client

/*** 呼叫工廠例項生成產品,輸出產品名

* @param $factory abstractfactory 工廠例項

*/public static function run(abstractfactory $factory)

}client::main();

//列印資料

//product a1

//product b1

//product a2

//product b2

?>

PHP設計模式 工廠模式之抽象工廠模式

abstract class 2 建立ttd 抽象類 ttd 抽象類 class ttdencoder abstract class ttdencoder 3 建立contact 抽象類 contact 抽象類 class contactencoder abstract class contacte...

php設計模式之抽象工廠

案例 追mm少不了請吃飯了,去麥當勞,只管向服務員說 兩個b 就行了。麥當勞就是b 的abstractfactory,b 裡含有漢堡,雞翅和飲料.麥當勞或肯德基會根據b 的規格,讓漢堡factory,雞翅factory,飲料factory分別生產對應b 的材料.抽象工廠模式 提供乙個建立一系列相關或...

設計模式之工廠模式之抽象工廠(php實現)

抽象工廠模式 先來認識下什麼是產品族 位於不同產品等級結構中,功能相關聯的產品組成的家族。圖中的bmwcar和benzcar就是兩個產品樹 產品等級結構 而如圖所示的benzsportscar和bmwsportscar就是乙個產品族。他們都可以放到跑車家族中,因此功能有所關聯。同理bmwbussin...