淺談幾種創建型模式的優缺點及其相關性

本文只是從文字、概念上來描述一下,並沒有給出類圖和相關代碼,適合有一定基礎的人閱讀。

在23種GOF設計模式中,創建模式主要有以下幾種:

簡單工廠模式Simple Factory

工廠方法模式Factory Method

抽象工廠模式Abstract Factory 

單例模式Singleton

多例模式Multiton

建造模式Builder

原型模式 Prototype 

一、簡單工廠模式

簡單工廠模式Simple Factory,又稱靜態工廠方法模式。它是類的創建模式。是由一個工廠對象決定創建出哪一種產品類的實例,是不同的工廠方法模式的一個特殊實現。

優點:

u 模式的核心是工廠類,該類中含有必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅負責“消費”產品。

u 簡單工廠模式實現了對責任的分割。

缺點:

u 當產品類有複雜的多層次等級結構時,工廠類只有它自己。以不變應萬變。

u 模式中工廠類集中了所有的產品創建邏輯,形成一個無所不知的全能類。

u 將多個創建邏輯放在一個類中,當產品類有不同接口種類時,工廠類需要判斷在什麼時候創建某種產品,使得系統在將來進行功能擴展時較爲困難。

u 該模式採用靜態方法作爲工廠方法,而靜態方法無法由子類繼承,因此工廠角色無法形成基於繼承的等級結構。

二、工廠方法模式

工廠方法模式Factory Method,又稱多態性工廠模式。在工廠方法模式中,核心的工廠類不再負責所有的產品的創建,而是將具體創建的工作交給子類去做。該核心類成爲一個抽象工廠角色,僅負責給出具體工廠子類必須實現的接口,而不接觸哪一個產品類應當被實例化這種細節。

優點:

u 多態性:客戶代碼可以做到與特定應用無關,適用於任何實體類。

u 子類提供掛鉤。基類爲工廠方法提供缺省實現,子類可以重寫新的實現,也可以繼承父類的實現。-- 加一層間接性,增加了靈活性

u 連接並行的類層次結構。

u 良好的封裝性,代碼結構清晰。

u 擴展性好,在增加產品類的情況下,只需要適當修改具體的工廠類或擴展一個工廠類,就可“擁抱變化”。

u 屏蔽產品類。產品類的實現如何變化,調用者都不需要關心,只需關心產品的接口,只要接口保持不變,系統中的上層模塊就不會發生變化。

u 典型的解耦框架。高層模塊只需要知道產品的抽象類,其他的實現類都不需要關心,符合迪米特法則,符合依賴倒置原則,符合里氏替換原則。

缺點:

u 需要Creator和相應的子類作爲factory method的載體,如果應用模型確實需要creator和子類存在,則很好;否則的話,需要增加一個類層次。

三、抽象工廠模式

抽象工廠模式Abstract Factory,又稱工具箱模式。它提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類 – 客戶端不必指定產品的具體類型,創建多個產品族中的產品對象。

優點:

u 分離了具體的類,一個工廠封裝創建產品對象的責任和過程,它將客戶與類的實現分離

易於交換產品系列,只需改變具體的工廠就可以使用不同的產品配置。

u 有利於產品的一致性,當一個系列中的產品對象被設計成一起工作時,一個應用一次只能使用同一個系列中的對象。

缺點:

u 難以支持新的產品等級結構,支持新的產品等級結構就要擴展抽象工廠接口。

四、單例模式

單例模式Singleton:一個類僅有一個實例,自行實例化並向整個系統提供一個訪問它的全局訪問點。

優點:

u 跨平臺:使用合適的中間件,可以把singleton模式擴展爲跨多個JVM和多個計算機工作。

u 適用於任何類:只需把一個類的構造函數變成私有的,並且在其中增加相應的靜態函數和變量,就可以把這個類變爲singleton

u 可以通過派生創建:給定一個類,可以創建它的一個singleton子類。

u 延遲求值:如果singleton從未使用過,那麼就絕不會創建它。

缺點:

u 摧毀方法未定義:沒有好的方法去摧毀一個singleton,或者解除其責任。

u 不能繼承:從singleton派生的類並不是singleton。如果要使其成爲singleton,必須要增加所需的靜態函數和變量。

u 效率問題:每次調用instance方法都會執行if語句,多餘。

u 不透明性: singleton的使用者知道它們正在使用一個singleton ,因爲它們必須要調用instance方法。

五、多例模式

多例模式Multiton:多例模式爲對象的創建模式。多例模式中的多例類可以有多個實例,而且多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。

特點:

u 多例類可有多個實例。

u 多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。

六、建造模式

建造模式Builder:建造模式是對象的創建模式。建造模式可以將一個產品的內部表象與產品的生成過程分割開來,從而可以使一個建造過程生成具有不同的內部表象的產品對象。將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

優點:

u 建造模式的使用使得產品的內部表象可以獨立地變化。使用建造模式可以使客戶端不必知道產品內部組成的細節。

u 每一個Builder都相對獨立,而與其他的Builder無關。

u 模式所建造的最終產品更易於控制。

缺點:

u 創建者模式比較符合產品差別不大的對象的創建,如果差別很大,就會導致非常多的具體的創建者,這時候最好結合工廠方法模式。

七、原型模式

原型模式 Prototype :用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。

優點:

u 原型模式允許動態地增加或減少產品類。由於創建產品類實例的方法是產品類內部具有的,因此增加新產品對整個結構沒有影響。

u 原型模式提供簡化的創建結構。工廠方法常需要有一個與產品類相同的等級結構,而原型模式不需要。對Java設計者,原型模式有其特有方便之處,Java語言已將原型模式設計到語言模型裏。如果善於利用原型模式和Java語言特點,可事半功倍。

u 具有給一個應用軟件加載新功能的能力。如:一個分析web服務器的記錄文件的應用軟件,針對每一種記錄文件格式,都可以由一個相應的“格式類”負責。如果出現了應用軟件所不支持的新的web服務器,只需提供一個格式類的克隆,並在客戶端登記即可,不必給每個軟件的用戶提供一個全新的軟件包。

u 產品類不需要非得有任何事先確定的等級結構,因爲原型模式適用於任何的等級結構。

缺點:

u 每一個類必須配備一個克隆方法。

u 配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。

八、相關性

幾種模式的相關性:

u 簡單工廠是基礎。

u 工廠方法模式是簡單工廠模式的進一步抽象和推廣,定義了工廠接口,將實際的創建工作推遲到子類中,如果只有一個具體工廠類,可以改造爲簡單工廠模式。

u 抽象工廠模式是對象的創建模式,是工廠方法模式的進一步推廣,抽象工廠模式經常用工廠方法來實現。抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態。

u 工廠方法模式針對的是一個產品等級結構。抽象工廠模式需要面對多個產品等級結構。

u 單例模式有比較強烈的物理意義,可以用在許多細微的地方,不一定與類層次關聯,與其他創建型模式並不矛盾,可以用單例模式來實現其他模式中的對象,如抽象工廠模式、建造模式和原型模式等。

u 多例模式是單例模式的自然推廣。

u 建造模式與抽象工廠模式相比,都可以創建複雜對象,但建造模式着重於一步步構造一個複雜對象,抽象工廠模式着重於一系列的產品對象,相應地,建造模式是在最後的一步返回產品,抽象工廠模式的產品是立即返回的。可以搭配使用抽象工廠模式和建造模式,客戶端通過調用建造模式,間接地調用抽象工廠模式的工廠角色,工廠模式返還不同產品族的零件,建造模式把它們組裝起來。

u 原型模式與抽象工廠模式競爭,根據應用需求進行取捨。


發佈了90 篇原創文章 · 獲贊 110 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章