設計模式筆記(十一)--建造者模式、原型模式、單例模式

建造者模式(Builder Pattern)

封裝一個產品的構造過程,並允許按步驟構造。

還有一個通俗的定義是:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

簡單點說,就是客戶類想要創建結構或者邏輯特別複雜的產品對象時,讓建造者幫忙構建產品,建造者負責產品各個部件的構建以及最終產品的組裝。


客戶類指示構造器按什麼流程構造產品,並可以通過它得到最終構建好的產品。具體的構建者負責創建並保存真正的產品。

這樣,就將一個複雜對象的創建過程封裝起來了。客戶類只看到抽象的構造器接口IBuilder,所以實現可以被隨便替換。建造者模式經常被用來創建組合結構類型的對象。但對客戶類而言,需要了解更多的關於產品的知識。

建造者模式(Builder Pattern)也可以翻譯成 創建者模式/構造者模式/構造器模式/生成器模式。

具體的例子也很簡單就不貼了,可以百度一下,但要注意產品Product和具體建造者ConcreteBuilder是組合關係,具體建造者必須負責產品實例的生命週期,一般在構造器中實例化產品。

原型模式(Prototype Pattern)

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

簡單點說,就是複製已有的實例來創建新的實例。當然,可以完全複製原型實例所有的資源(深複製)也可以引用原型實例的資源(淺複製)。

在Java中基本類型數據都是深複製,但一般引用類型數據是淺複製的,也就是說引用類型一般都是指向相同的引用對象。原型類Prototype需要實現Cloneable接口(在運行時通知虛擬機可以安全地在實現了此接口的類上使用clone方法。在java虛擬機中,只有實現了這個接口的類纔可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常),重寫Object類中的clone方法來獲取拷貝的對象,因其原來作用域是protected的,所以Prototype類需要將clone方法的作用域修改爲public類型。如果要實現深複製,只需讓兩個類都實現Cloneable接口並重載clone()方法,在客戶類中指向新clone的引用即可。但要注意,並不是所有的類都能深度clone,像String、StringBuffer等對象是不能深複製的。

使用原型模式創建對象比直接new一個對象在性能上要好的多,因爲Object類的clone方法是一個native方法,效率特別高,特別是複製大對象時,性能的差別非常明顯。
使用原型模式的另一個好處是簡化對象的創建,使得創建對象就像我們在編輯文檔時的複製粘貼一樣簡單。

但也要認識到,對象的複製有時會相當複雜。

單例模式(Singleton Pattern)

我的這篇文章:單例類

最常用的就是枚舉單例和雙檢鎖單例,其它的什麼懶漢餓漢就不要管了。

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