創建型設計模式是設計模式的入門基礎,主要包括工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式,以及簡單工廠模式,本文對他們進行了分析對比,總結了創建型模式之間的區別聯繫 ...
創建型模式是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 達到對象的創建與使用的隔離 建造者模式把產品組裝為複雜的產品 原型模式是要求通過“複製”來創建,單例模式要求只能創建一個,是進一步的需求升級