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


 
創建型模式是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 達到對象的創建與使用的隔離
建造者模式把產品組裝為復雜的產品
原型模式是要求通過“復制”來創建,單例模式要求只能創建一個,是進一步的需求升級
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM