原型模式
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一個對象性能好很多,特別是要在一個循環體內產生大量的對象時,原型模式可以更好地體現其優點。
缺點:
這既是它的優點也是缺點,直接在內存中拷貝,構造函數是不會執行的,在實際開發中應該注意這個潛在的問題。優點就是減少約束,缺點也是減少了約束,需要大家在實際應用時考慮。