PHP工廠模式學習

2021-08-03 17:16:45 字數 3358 閱讀 1737

目錄

工廠方法模式,可以更好的處理客戶的需求變化。

簡單工廠模式把例項化物件的工作推遲到了專門的工廠類中。但是當客戶需求出現變化的時候,我們不僅得增加新的類和修改工廠類以適應客戶的需求,這是設計模式所不允許的。工廠方法模式應運而生。

解決思路:那裡變化,封裝**。把具體工廠封裝起來。

工廠方法模式又稱為工廠模式,又叫虛擬構造器(virtual constructor)模式或者多型工廠模式(polymorphic factory),在工廠方法模式中,父類負責定義建立物件的公共介面,而子類則負責生成具體物件,這樣做的目的是將例項化操作延遲到子類中完成。

抽象產品角色(product) : 定義產品介面

具體產品角色(concreteproduct) : 實現介面product的具體產品類

抽象工廠角色(creator) : 宣告工廠方法(factorymethod), 並且返回乙個產品

真實工廠(concretecreator) : 實現factorymethod工廠方法,由客戶端呼叫,返回乙個產品例項。

php**

icoat.php

namespace

factorymethod;

//抽象產品介面

inte***ce

icoat

ifactory.php

namespace

factorymethod;

//抽象工廠介面

inte***ce

ifactory

fashioncoat.php

namespace

factorymethod;

//具體產品

class

fashioncoat

implements

icoat

}

businesscoat.php

namespace

factorymethod;

//具體產品

class

businesscoat

implements

icoat

}

fashionfactory.php

namespace

factorymethod;

//具體工廠類,用於建立時尚上衣

class

fashionfactory

implements

ifactory

}

businessfactory.php

namespace

factorymethod;

//具體工廠類,用於建立商務上衣

class

businessfactory

implements

ifactory

}

客戶端**

client.php

using factorymethod;

$fashioncoat = (new fashionfactory())->createcoat();

$fashioncoat->showcoat();

$businesscoat = (new businessfactory())->createcoat();

$businesscoat->showcoat();

以上**會輸出:

->這是時尚上衣

->這是商務上衣

在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。

基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,是因為所有的具體工廠類都具有同一抽象父類。

使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了。這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。

在工廠方法模式中,類的個數將成對增加。

在以下情況下可以使用工廠方法模式:

乙個類不知道它所需要的物件的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;客戶端需要知道建立具體產品的工廠類。

乙個類通過其子類來指定建立哪個物件:在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。

將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無須關心是哪乙個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。

工廠方法模式又稱為工廠模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件,這樣做的目的是將產品類的例項化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該例項化哪乙個具體產品類。

工廠方法模式包含四個角色:抽象產品是定義產品的介面,是工廠方法模式所建立物件的超型別,即產品物件的共同父類或介面;具體產品實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,它們之間往往一一對應;抽象工廠中宣告了工廠方法,用於返回乙個產品,它是工廠方法模式的核心,任何在模式中建立物件的工廠類都必須實現該介面;具體工廠是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並可由客戶呼叫,返回乙個具體產品類的例項。

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了物件導向的多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不負責產品類被例項化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

工廠方法模式的主要優點是增加新的產品類時無須修改現有系統,並封裝了產品物件的建立細節,系統具有良好的靈活性和可擴充套件性;其缺點在於增加新產品的同時需要增加新的工廠,導致系統類的個數成對增加,在一定程度上增加了系統的複雜性。

工廠方法模式適用情況包括:乙個類不知道它所需要的物件的類;乙個類通過其子類來指定建立哪個物件;將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無須關心是哪乙個工廠子類建立產品子類,需要時再動態指定。

引用自bobby0322

學習php設計模式 php實現抽象工廠模式

抽象工廠模式 abstact factory 是一種常見的軟體設計模式。該模式為乙個產品族提供了統一的建立介面。當需要這個產品族的某一系列的時候,可以為此系列的產品族建立乙個具體的工廠類。一 意圖 抽象工廠模式提供乙個建立一系統相關或相互依賴物件的介面,而無需指定它們具體的類 gof95 二 抽象工...

PHP 工廠模式

文章 簡單工廠模式 抽象基類 類中定義抽象一些方法,用以在子類中實現 繼承自抽象基類的子類 實現基類中的抽象方法 工廠類 用以例項化物件 看完文章再回頭來看下這張圖,效果會比較好 採用封裝方式 class calc result num1 num2 break return result catch...

php 工廠模式

在開發大型系統過程中,往往會出現這樣一種情況 我有一部分基礎資料,是類classa是從資料庫a讀取出來的,其他很多的功能都是基於這個基礎資料來操作的。現在呢,我想把資料從資料庫a變成從另外的資料來源去獲取,這時候,要修改起來就比較麻煩,要修改其他很多類的 這種設計顯然是不夠靈活的,換句話說,就是緊耦...