原型模式:用原型實例指定創(chuàng)建對象的種類汤踏,并通過拷貝這些原型創(chuàng)建新的對象。
實現(xiàn)Cloneable接口袋毙。Cloneable接口诬烹,它的作用只有一個砸烦,就是在運行時通知虛擬機可以安全地在實現(xiàn)了此接口的類上使用clone方法。在虛擬機中绞吁,只有實現(xiàn)了這個接口的類才可以被拷貝幢痘,否則在運行時會拋出CloneNotSupportedException異常。重寫Object類中的clone方法掀泳。所有類的父類都是Object類雪隧,Object類中有一個clone方法,作用是返回對象的一個拷貝员舵,但是其作用域protected類型的脑沿,一般的類無法調(diào)用,因此马僻,Prototype類需要將clone方法的作用域修改為public類型庄拇。
我們用來克隆的對象,帶有一個用來實現(xiàn)的抽象方法韭邓。
實現(xiàn)了原型類的方法措近,實現(xiàn)了原型類的方法來進行我們想要的操作。
我們在客戶端調(diào)用具體原型類ConcretePrototypel來調(diào)用我們想要的方法女淑。
原型模式的優(yōu)點: 使用原型模式創(chuàng)建對象比直接new一個對象在性能上要好的多瞭郑,因為Object類的clone方法是一個本地方法,它直接操作內(nèi)存中的二進制流鸭你,特別是復制大對象時屈张,性能的差別非常明顯。使用原型模式的另一個好處是簡化對象的創(chuàng)建袱巨,使得創(chuàng)建對象就像我們在編輯文檔時的復制粘貼一樣簡單阁谆。
原型模式使用注意事項:使用原型模式復制對象不會調(diào)用類的構造方法。因為對象的復制是通過調(diào)用Object類的clone方法來完成的愉老,它直接在內(nèi)存中復制數(shù)據(jù)场绿,因此不會調(diào)用到類的構造方法。不但構造方法中的代碼不會執(zhí)行嫉入,甚至連訪問權限都對原型模式無效焰盗。還記得單例模式嗎?單例模式中咒林,只要將構造方法的訪問權限設置為private型熬拒,就可以實現(xiàn)單例。但是clone方法直接無視構造方法的權限映九,所以梦湘,單例模式與原型模式是沖突的,在使用時要特別注意。深拷貝與淺拷貝捌议。Object類的clone方法只會拷貝對象中的基本的數(shù)據(jù)類型哼拔,對于數(shù)組、容器對象瓣颅、引用對象等都不會拷貝倦逐,這就是淺拷貝。如果要實現(xiàn)深拷貝宫补,必須將原型模式中的數(shù)組檬姥、容器對象、引用對象等另行拷貝粉怕。