建立型設計模式對比總結 設計模式(八)

post200發表於2021-09-09

建立型模式是new 的一種替代方式,可以將物件的建立與具體的型別進行分離

目前已經介紹了5種建立型設計模式(如果簡單工廠算一種的話,那就是6種)

分別是:

簡單工廠模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式

原文地址:

簡單工廠模式


靜態工廠方法是一種最簡單的建立的替代方法

基本上不涉及複雜的處理過程,可能執行的僅僅是包裝、轉換等 

 

比如,一個靜態方法,根據引數進行if else判斷,或者switch選擇進而確定需要建立的物件型別 

比如,Long內部的valueOf 接受不同型別的引數,進而轉換為Long型別物件

他可以是一個方法,也可以有多個靜態方法

儘管通常簡單工廠模式將只會建立一種型別的產品物件

但是,你也可以N個靜態方法,建立N多種不同型別的物件

不過一般不這麼用,不夠清晰,沒有條理雜亂,完全不符合單一職責原則

所以對於簡單工廠模式,我們一般說簡單工廠模式只能建立一種型別的產品

 

簡單工廠模式它的核心就是:

一個類  靜態方法    來解決物件的建立問題

一個類吃遍天下

工廠方法模式


簡單工廠模式一個類吃遍天下,職責過多,就會有各種原因可能要修改這個類,好比你是兩個班級的班主任,不管哪個班級的學生有事情都要找你。

既不符合單一職責原則,也不符合開閉原則

所以為了解決這個問題,進化出來工廠方法模式

 

工廠方法模式不再是一個類吃遍天下

工廠方法模式透過與產品等級結構相同的工廠等級結構,對產品進行建立 

每個工廠不再是多個職責,僅僅建立一種型別的產品,符合單一職責

而且,對於新增的產品等級,只需要擴充套件工廠,而不需要修改現有的工廠

所以說工廠方法模式是簡單工廠模式的標準版本,規範版本

工廠方法定義了一個用於建立物件的介面,他的子類(具體的工廠類)負責具體產品的建立

這個抽象的工廠角色並不知道他所建立的物件的具體型別,因為是子類決定了具體型別

將建立物件的職責委託給了多個子類中的一個,所以也說工廠方法模式將物件的建立延遲到其子類

比如

Creator creator = new ConcreteCreator();

Product product= creator.create();

客戶端透過creator.create()獲得產品

不用關心Creator具體的型別,也不知道Product具體的型別,都是面向抽象的程式設計

建立的產品的具體的型別完全是動態的根據creator的具體的型別ConcreteCreator決定的

所以工廠方法模式也叫做多型工廠模式

抽象工廠模式


工廠方法模式雖然解決了簡單工廠模式中的各種問題,進行了升級改良

但是

工廠模式只能建立一種型別的產品

因為工廠模式的頂級抽象角色規定了建立的協議

他只有一種返回型別

為了解決工廠方法只能建立一種型別的產品的弊端,又擴充出抽象工廠的模式

將工廠的建立能力擴充到產品族

也就是頂級的抽象角色中,可以建立一系列型別的產品

這一系列型別的產品中的一員(每種型別一個)就組成了一個產品族的概念

實際使用的時候,一定要注意,他們必須要有產品族的概念

如果你沒有產品族的概念,非要生搬硬套的組織在一起,比如一個工廠生產輪胎和CPU和熱水袋,他們之間使用時毫無關聯,必然不會符合單一職責原則 

有了產品族的概念,而且這一族產品也很可能一起出現使用,才是抽象工廠模式最好的運用

當一個系統要由多個產品系列中的一個來配置時,典型的就是類似廠家替換這種場景,非常適合抽象工廠

建造者模式


在有了能夠生產一族產品的能力之後,比如可以生產 輪胎 發動機

那麼,就會有應用這一族產品的需求 

對於這一族產品的運用,又可以將他們使用邏輯,也就是裝配邏輯進行分離,這個分離就是建造者模式

建造者模式僅僅關心構造一個完整複雜產品的步驟,而不關心生產細節

細節由具體的builder進行實現

builder就相當於抽象工廠模式中的Creator,只不過builder還要負責每一個步驟的裝配

建造者模式也通常藉助於抽象工廠模式來進行實現,就是Creator也負責最終產品的組裝交付

原型模式


原型模式類似與工廠模式

工廠模式是透過“建立” 來獲得物件

而原型模式則是透過“複製”來獲得物件

Java語言的機制---所有的類都繼承自Object,使得Java天然的支援原型模式

只需要實現Cloneable介面即可,另外按照你的需要看是否實現clone方法

而對於稍微複雜點的原型模式下

比如建立的原型物件數量不固定或者產品種類較多,不方便管理,還出現了 帶“管家”的原型模式

透過管理器這個管家對原型物件進行管理

他提供獲取物件的方法

原型模式是另一種視角的建立

單例模式


單例模式邏輯含義比較簡單,就是有些場景就是需要唯一的物件,或者說有些場景沒必要使用多個物件

保證類只有一個例項,並提供一個訪問他的全域性訪問點

比如,原型模式中的管理器,除非特殊必要,否則他就應該是一個單例

再比如,windows的工作管理員

重點是實現的過程---如何保證的確只有一個物件被產生

這個全域性唯一的訪問點往往又是簡單工廠模式---一個靜態方法提供

對比、聯絡、區別


本身作為建立型模式,他們必然擁有相同的特徵--“建立”物件,只不過是側重點不同

而且各種型別模式之間,很難不發生點關係

 

最基本的共性就是都是用來建立物件,都是new的替代方法

簡單工廠、工廠方法、抽象工廠、建造者、原型都是建立物件

而單例除了第一次建立,其餘時候都是返回一個已經存在的物件

建造者模式又特別關注比較複雜的物件

 

簡單工廠模式、工廠方法模式、抽象工廠模式都是工廠模式的形態之一

工廠方法模式是簡單工廠模式的規範化與標準化擴充套件

如果只有一個具體工廠類,工廠方法模式自然可以改造成簡單工廠模式

抽象工廠模式是工廠模式中最為抽象和最具一般性的一種形態

抽象工廠經常透過工廠方法來實現

(也可以藉助於原型模式來實現,抽象工廠可以儲存一個被複製的原型物件的集合,然後返回產品的物件)

 

簡單工廠模式和工廠方法模式都是針對一個產品等級結構,而抽象工廠則可以生產多個等級結構的產品 

 

建造者模式與抽象工廠模式都可以用來建立同時屬於幾個產品族的物件,也就是他們都可以建立複雜的物件

但是建造者模式進一步的對組裝過程進行了分離

抽象工廠模式中,每一次的工廠物件呼叫都會建立一個完整的產品物件

客戶端來決定到底如何處理這些產品,可以組裝為更大的產品,也可能不會 

建造者模式則關注藉助於產品族的各個產品,一點點的構造出一個更為複雜的產品

而且,產品的組裝過程發生在建造者內部封裝起來

建造者模式重點在於組裝,複雜物件構建邏輯的分離

但是複雜物件的的每一個組成部分往往又都是工廠模式建立

建立者模式與工廠模式經常結合使用

建造者模式在最後一步返回一個完整的產品(一般都是複雜的)

抽象工廠模式則是立即返回每一個產品,具體的產品如何處理隨便你

所以說,建造者模式是抽象工廠模式在某種場景下的一種延伸擴充

 

單例模式保證只有一個物件,它提供了一個靜態方法用於獲取這個唯一的物件

所以說,單例模式使用了簡單工廠模式

不過提供工廠方法的這個類就是他自身,而且靜態方法返回的物件也是他自身,是自己的工廠

 

單例模式與其他建立型模式並不衝突也不矛盾

其他模式中的物件,也可以是單例的

 

建立型模式之間是相互發展,相互借鑑的,結合具體的情況,適用於不同的場合

工廠方法模式,抽象工廠模式是最基礎的建立,以代替new 達到物件的建立與使用的隔離

建造者模式把產品組裝為複雜的產品

原型模式是要求透過“複製”來建立,單例模式要求只能建立一個,是進一步的需求升級

原文出處:https://www.cnblogs.com/noteless/p/9995954.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2817825/,如需轉載,請註明出處,否則將追究法律責任。

相關文章