摘要:原文地址設計模式八工廠模式在設計模式七設計模式分類中我們提到過創建設計模式,創建設計模式專注于設計對象和實例的創建過程。工廠模式工廠模式,也是五種設計模式中唯一的類的設計模式,即在類中就能實現的設計模式。
Introduction原文地址:PHP設計模式(八):工廠模式
在PHP設計模式(七):設計模式分類中我們提到過創建設計模式(Creation patterns),創建設計模式專注于設計對象(Object)和實例(Instance)的創建過程。
創建設計模式包括下面五種設計模式:
抽象工廠設計模式(Abstract Factory)
生成器模式(Builder)
工廠設計模式(Factory Method)
原型設計模式(Prototype Method)
單例設計模式(Singleton)
當程序逐漸擴展的時候,需要更多的新對象,新對象的創建不應該依賴于創建者,換句話說,新對象的創建過程,不應該依賴調用創建函數的對象。為了減少冗余,增加拓展性,工廠模式就是一種創建新對象時使用的設計模式。
工廠模式工廠模式,也是五種設計模式中唯一的類的設計模式(Class patterns),即在類中就能實現的設計模式。
聽起來挺抽象?對比原型設計模式,這是一種對象設計模式(Object patterns),通過對象的__clone()方法來實現的設計模式。
在工廠模式中,新創建的對象/產品并不依賴于生產它的對象/工廠,新對象和調用者之間是低耦合狀態。通常調用者和工廠交互,由工廠來生成新對象,新對象只和工廠有關。
簡單來說,當需求對類的個數不明確的時候,可以使用工廠模式,如:
你需要創建一個在線博物館,但你并不確切的知道究竟有多少文物,你不可能無限的增加新的文物類,同時對于損毀的文物,你不可能無限的去清理這些類。
反過來說,如果你確切的知道類的總量,那么你就沒有必要使用工程模式,直接通過繼承的方式就能實現好的設計。
還是使用我們慣用的鯨魚和鯉魚的例子,現在我們想實現一個海洋館,目前我們并不確定究竟有多少海洋生物。
先是一個抽象的工廠類:
create(); } } ?>
然后是兩個工廠:鯨魚工廠和鯉魚工廠
create(); } } class CarpFactory extends Factory { protected function create() { $carp = new Carp(); return $carp->create(); } } ?>
然后是抽象的動物接口:
然后是具體的動物類:鯨魚類和鯉魚類
name = "Whale"; return $this->name . " is created. "; } } class Carp implements Animal { private $name; public function create() { $this->name = "Carp"; return $this->name . " is created. "; } } ?>
下面給出使用工廠創建鯨魚和鯉魚的代碼:
factoryStart(); $carpFactory = new CarpFactory(); echo $carpFactory->factoryStart(); ?>
運行一下:
Whale is created. Carp is created.
到這里你是不是覺得,其實直接生成兩個類就行了,何必搞這么復雜?別著急,好戲在后面。
修改類的方法由于Interface的限制,修改類的方法被限定在了create()方法中,因此可以避免偷懶的程序員新增加的不合理函數。
簡單修改一下:
name = "Whale"; return $this->name . " is created. Whale eats fish. "; } } class Carp implements Animal { private $name; public function create() { $this->name = "Carp"; return $this->name . " is created. Carp eats moss. "; } } ?>
由于對象是由工廠造出來的,外部不可能直接調用或者修改類的實現,類的修改被限定在了類的對外接口上。這樣的架構易于擴展。
一個工廠工廠模式的靈活,在于可以只擁有一個工廠,卻能生產多個類/產品。
修改我們的抽象工廠,給create()方法增加animal接口:
create($animal); } } ?>
然后合并之前的鯨魚工廠和鯉魚工廠:
create(); } } ?>
修改使用工廠創建鯨魚和鯉魚的代碼:
factoryStart(new Whale()); echo $animalFactory->factoryStart(new Carp()); ?>
運行一下:
Whale is created. Whale eats fish. Carp is created. Carp eats moss.
鯨魚類和鯉魚類源源不斷的從一個工廠中被創建出來了。通過這種設計模式,類的創建過程統一通過一個接口來實現,接口外部并不需要關心類是如何被創建出來的,而接口內部實現也得到了很好的拓展性。
Summary本文介紹了工廠設計模式,使用這種設計模式,可以讓你通過一個或多個工廠的接口,創建無數新類,調用任意類的方法。由于接口嚴格定義了新類/產品的形態,因此在維護和拓展的時候,可以省去不少力氣。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21678.html
摘要:原型設計模式中的構造函數使用創建新對象時,并不會觸發類的構造函數。事實上,使用構造函數并不一定是一個好的設計,由于構造函數內的邏輯無法被外部控制,當需要修改一個類構造時的邏輯時,除了修改類的構造函數實現以外,別無他法,這破壞了類的封裝。 原文地址:PHP設計模式(九):原型設計模式 Introduction 在PHP設計模式(八):工廠模式中我們介紹了創建設計模式(Creation p...
摘要:即建造者模式可以強制實行一種分步驟進行的建造過程。指導類負責調用適當的建造者來組建產品,指導類一般不與產品類發生依賴關系,與指導類直接交互的是建造者類建造者模式優點建造者模式的封裝性很好。 建造者模式 將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。主要解決在軟件系統中,有時候面臨著一個復雜對象的創建工作,由于需求的變化,這個復雜對象的某些部分經常面臨著劇烈的變化...
摘要:工廠模式使一個類的實例化延遲到其子類。參考系列源地址系列目錄設計模式概述設計模式一簡單工廠模式設計模式二工廠方法模式設計模式三抽象工廠模式設計模式四單例模式 一、什么是簡單工廠模式 簡單工廠 (Simple Factory)又稱靜態工廠方法模式(Static Factory Method Pattern) 使用的頻率可以說是非常之高,它的官方解釋為:定義一個用于創建對象的接口,讓子...
摘要:對于這個問題,接下來的工廠方法模式可以解決這個問題。二工廠方法模式的優點擁有良好的封裝性,代碼結構清晰。參考系列源地址系列目錄設計模式概述設計模式一簡單工廠模式設計模式二工廠方法模式設計模式三抽象工廠模式設計模式四單例模式 簡單工廠簡述: 簡單工廠模式實現了產品類的代碼跟客戶端代碼分離,但會有一個問題,優秀的代碼是符合開閉原則如果你要加一個C類產品,你就要修改工廠類里面的代碼,也就是說...
摘要:支持增加任意產品抽象工廠用來生產不同產品族的全部產品。對于增加新的產品,無能為力支持增加產品族參考系列源地址系列目錄設計模式概述設計模式一簡單工廠模式設計模式二工廠方法模式設計模式三抽象工廠模式設計模式四單例模式 一、什么是抽象工廠模式 抽象工廠模式的用意為:給客戶端提供一個接口,可以創建多個產品族中的產品對象 ,而且使用抽象工廠模式還要滿足以下條件: 系統中有多個產品族,而系統一次...
閱讀 2137·2021-11-22 15:22
閱讀 1286·2021-11-11 16:54
閱讀 1807·2021-09-23 11:32
閱讀 3007·2021-09-22 10:02
閱讀 1771·2019-08-30 12:59
閱讀 1085·2019-08-29 16:27
閱讀 622·2019-08-29 13:21
閱讀 2464·2019-08-28 17:57