設計模式_原型模式

原型模式

1、定義

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

原型是一個創建型的模式。原型二字表明瞭該模式應該有一個樣板實例,用戶從這個樣板對象中複製出一個內部屬性一致的對象,這個過程也就是我們俗稱的“克隆”。被複制的實例就是我們所稱的“原型”,這個原型是可定製的。

原型模式多用於創建複製的或者構造耗時的實例,因爲這種情況下,複製一個已經存在的實例可使程序運行更加高效。


2、使用場景

1)、類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等,通過原型拷貝避免這些消耗。

2)、通過new產生一個對象需要非常頻繁地數據準備或訪問權限,這時可以使用原型模式。

3)、一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用,即保護性拷貝。

注意:通過實現Cloneable接口的原型模式在調用clone函數構造實例時並不一定比通過new操作速度快,只有通過new構造對象較爲耗時或者說成本較高時,通過clone方法才能夠獲得效率上的提升。


3UML類圖

角色介紹:

Client:客戶端用戶

Prototype:抽象類或者接口,聲明具備clone能力,cloneable接口。

ConcretePrototype:具體的原型類


4、代碼示例

見ArrayList源碼與Intent源碼!

需要注意的是,通過clone拷貝對象時並不會執行構造函數!

淺拷貝,也稱影子拷貝,多個引用指向同一個對象。

深拷貝,在拷貝對象時,對於引用型的字段也要採用拷貝的形式,而不是單純引用的形式。

原型模式是一個非常簡單的一個模式,它的核心問題就是對原始對象進行拷貝,在這個模式的使用過程中需要注意的一點就是:深、淺拷貝的問題。

使用clone和new需要根據構造對象的成本決定,如果對象的構造成本比較高或者構造較爲麻煩,那麼使用clone()函數效率比較高,否則可以使用new的形式。

5、總結

原型模式本質上是對象拷貝,使用原型模式可以解決構建複雜對象的資源消耗問題,能夠在某些場景下提升創建對象的效率。還有一個重要的用途就是保護性拷貝,也就是某個對象對外可能是隻讀的,爲了防止外部對這個只讀對象修改。

優點:

原型模式是在內存中二進制流的拷貝,要比直接new一個對象性能好很多,特別是要在一個循環體內產生大量的對象時,原型模式可以更好地體現其優點。

缺點:

這既是它的優點也是缺點,直接在內存中拷貝,構造函數是不會執行的,在實際開發中應該注意這個潛在的問題。優點就是減少約束,缺點也是減少了約束,需要大家在實際應用時考慮。

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