摘要:利用工廠方法模式,請求者發出請求,而不具體創建產品。正是因為這個原因,使用工廠方法模式可以簡化復雜的創建過程,關鍵就在于它在維持一個公共接口。
創建型設計模式
包括以下五種:
抽象工廠
生成器
工廠方法
原型
單例
我們選擇工廠方法和原型模式作為將用PHP實現的創建型設計的例子
工廠方法模式是這5個設計模式中唯一的一種類設計模式
原型模式屬于對象類模式,可以使用PHP_clone方法實現。首先基于原型實例化(創建)一個對象,然后由這個實例化對象進一步克隆其他對象
使用創建型模式時,最有意思的是,當程序和系統越來越依賴于對象組合而不是依賴于類繼承時,創建型模式中的程序變成由對象構成的系統,而對象又由其他對象組合而成,所以任何單個對象的創建都不應該依賴于創建者
概念:工廠方法模式就是要創建某種東西,對于工廠方法模式,要創建的東西是一個產品,這個產品與創建它的類之間不存在綁定,為了保持這種松耦合,客戶會通過一個工廠發出請求,再由工廠創建所請求的產品。利用工廠方法模式,請求者發出請求,而不具體創建產品。
何時使用:如果實例化對象的子類可能變化,就要使用工廠方法模式
Why:對象的數目和類型都是未知的,一個類無法預計它要創建的對象數目,所以你不希望類與它要創建的類緊密綁定
案例模型:
步驟:
第一步是建立工廠:Creator接口
factoryMethod(); return $mfg; } } ?>
注意到,偽代碼注釋提示startFactory()方法需要返回一個產品(product),在實現中startFactory()希望factoryMethod()返回一個產品對象,所以,factoryMethod()的具體實現要構建并返回由一個按Product接口實現的產品對象
下面有兩個工廠類擴展了Creator,并實現了factoryMethod()方法,factoryMethod()實現通過一個Product方法(getProperties())返回一個文本或圖像產品,TextFactory和GraphicFactory實現中加入了這些內容
getProperties()); } } ?>
getProperties()); } } ?>
工廠方法設計模式中的第二個接口是Product。由于這是第一個實現,也是最簡單的實現,所有文本和圖像屬性都只實現一個方法getProperties():建立方法而無屬性,我們可以明確想要用這個方法做什么(比如可以有個返回值),只要方法名和可見性與簽名一致就不會有問題
可以利用這個實現,使得同一個方法getProperties()多態,分別返回圖像和文字,如下所示
mfgProduct = "This is a Text
mfgProduct; } } ?>
mfgProduct = "This is a Graphic
"; return $this->mfgProduct; } } ?>
上面你看到的This is a Graphic以及This is text,可以替換成你想放入的其它東西,工廠設計會創建這個對象,并把它返回給Client來使用。
這兩個工廠和產品分別覆蓋了抽象方法,來創建兩個不同的工廠和產品,它們都符合所實現的接口
客戶
這個模式最后一個參與者是隱含的(上面模型圖中顏色較淡的框):客戶。我們并不希望Client類直接做出產品請求。實際上,我們希望能夠通過Creator接口做出請求,這樣一來,如果以后我們增加產品或者工廠,客戶可以做同樣的請求來得到更多類型的產品,而不會破壞這個應用
someGraphicObject = new GraphicFactory(); echo $this->someGraphicObject->startFactory(); $this->someTextObject = new TextFactory(); echo $this->someTextObject->startFactory(); } } $worker = new Client(); ?>
注意Client對象并沒有向產品直接做出請求,而是通過工廠來請求,重要的是,客戶并不實現產品特性,而留給產品實現來體現。
在本章有個例子,是對上面代碼的改進,也可以稱作是在工廠中修改產品,但是本猿以為,例子似乎舉的不是很好,它把Html代碼嵌套在php代碼中,放在了產品類下的getProperties方法中,以供客戶調用的時候返回,所以我個人覺得這種方法不是很好,一大段代碼放在php中,也不方便編輯器編輯。設計模式是為了加快開發速度,這樣的方法我適得其反。作者是專家,可能也有出于其它考慮。不過里面有一個觀點我還是同意的,其中有一個輔助類的觀點。
所謂輔助類,就是把一些任務給一個多帶帶的對象來處理,而不是結合到某個參與者中。類似地,如果需要重用一組HTML標記,可以把它們打包到另一個對象中以便重用。下面是一個例子
topper = "Map Factory "; return $this->topper; } public function closeUp(){ $this->bottom = ""; return $this->bottom; } } ?>
上圖與之前的類圖不同,它們完成同樣的目標,不過它們的實現有所不同。這就是參數化工廠方法設計模式(上圖)與一般的工廠方法設計模式(原類圖)的主要區別之一,即客戶包含工廠和產品的引用。在參數化請求中,Client類必須指定產品,而不只是產品工廠,factoryMethod()操作中的參數是由客戶傳入的一個產品,所以客戶必須指出它想要的具體產品,不過,這個請求仍然通過Creator接口發出,所以,盡管客戶包含一個產品引用,但通過Creator,客戶仍與產品分離
一個工廠多個產品對于大多數請求,參數化工廠方法更為簡單,因為客戶只需要處理一個具體工廠,工廠方法操作有一個參數,指示需要創建的產品。而在原來的設計中,每個產品都有自己的工廠,不需要另外傳遞參數,產品實現依賴于各個產品的特定工廠。
要從參數化工廠方法設計模式實現多個產品,只需使用Product接口實現多個具體產品,另外,由于具體產品要同時包含文本和圖像,所以在這個例子中,并不是分別有這兩個多帶帶的產品,可以建立一個類,將文本和圖像作為一個同意的實體來處理,這并不違反單一職責原則,即每個類應當只有一個職責。對于這個類來說,這個單一職責就是顯示描述一個區域的文本和圖像
新工廠新工廠與原來的工廠類似,不過它們還包含一個參數和代碼提示。
factoryMethod($countryProduct); return $mfg; } } ?>
新的Creator抽象類中可以看到,factoryMethod()和startFactory操作都需要一個參數。另外代碼提示只是了一個Product對象,而不是Prodcut一個特定實現,所以可以接受Product的任何具體實例,下面來看看具體的創建者CountryFactory
country = $product; return ($this->country->getProperties()); } } ?>
這個具體創建者包含一個私有變量$country,其中包含客戶請求的特定產品,它再使用Product方法getProperties()將產品返回給客戶
與試圖讓任意數目的類和對象都保持不變相比,保持接口不變要容易得多。正是因為這個原因,使用工廠方法模式可以簡化復雜的創建過程,關鍵就在于它在維持一個公共接口。
本文參考書籍:《Learnig PHP設計模式》第2部分第5章
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21240.html
摘要:上章講的是創建型的設計模式,工廠方法上,這次要講的是另一本書關于工廠方法的一些概念以及案例模型等等。工廠方法模式假設你有一個關于個人事務管理的項目,功能之一是管理預約對象。 上章講的是創建型的設計模式,工廠方法(上),這次要講的是另一本書關于工廠方法的一些概念以及案例、模型等等。就像電影風雨哈佛路中那個老師提問,為什么要用另外的一張一張紙質資料,而不直接用書籍。女主回答說,因為不同的資...
摘要:設計模式設計模式基本原則設計原則按接口而不是按實現來編程按接口而不是按實現編程是指,要將變量設置為一個抽象類或接口數據類型的實例,而不是一個具體實現的實例。例如父類的一個改變會逐級向下傳遞給子類實現,這可能會影響子類使用的某個算法。 設計模式 設計模式基本原則 設計原則 ① : 按接口而不是按實現來編程 按接口而不是按實現編程是指,要將變量設置為一個抽象類或接口數據類型的實例,而不是一...
摘要:創建型模式主要有以下五種簡單工廠模式和工廠方法模式抽象工廠模式單例模式建造者模式原型模式在設計模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式。 一、 設計模式(Design pattern)是什么 設計模式是一套被反復使用、多數人知曉、經過分類編目的代碼設計的經驗總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 二、 為什么會有設計模式 在軟件開發過...
摘要:維基百科在軟件工程中,創建型設計模式是用于解決對象創建機制,嘗試在指定場景下使用合理的方式來創建對象的設計模式。維基百科說建造者模式是一種對象創建軟件設計模式,其目的是找到一種解決方案,以解決可伸縮構造函數的反模式。 1.創建型設計模式2.結構型設計模式3.行為型設計模式 創建型設計模式 簡而言之 創建型設計模式關注的是如何實例化一個或者一組相關的對象。 維基百科 在軟件工程中,創建型...
摘要:前言接下來將會為大家介紹設計模式中的創建型設計模式,在此之前需要掌握一定的對象繼承基礎。但是如果是工廠方法模式的話,則只需要往工廠方法中添加基類則可以。 前言 接下來將會為大家介紹設計模式中的創建型設計模式,在此之前需要掌握一定的JavaScript對象繼承基礎。 簡單工廠模式 先說說 什么是簡單工廠模式:又叫靜態工廠方法,由一個工廠對象決定創建某一種產品對象類的實例 看著定義有點懵,...
閱讀 1877·2021-11-19 09:40
閱讀 2594·2021-08-30 09:46
閱讀 2177·2021-08-03 14:01
閱讀 2648·2019-08-30 10:54
閱讀 1197·2019-08-29 16:38
閱讀 1440·2019-08-29 11:02
閱讀 2536·2019-08-28 18:16
閱讀 1679·2019-08-28 18:09