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

 
建立型模式是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 達到對象的建立與使用的隔離
建造者模式把產品組裝爲複雜的產品
原型模式是要求經過「複製」來建立,單例模式要求只能建立一個,是進一步的需求升級
相關文章
相關標籤/搜索