定義:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型戳寸,創(chuàng)建新的對象兜畸。
通俗理解:一個對象的產(chǎn)生可以不從零開始努释,直接從一個已經(jīng)初備雛形的對象克隆,然后再修改成具體要求的對象咬摇。也就是說:生產(chǎn)一個人伐蒂,可以不從0歲開始,而是在這個人18歲時取其DNA進行克隆肛鹏,這樣所有的克隆體都具備18歲的特征逸邦,然后這些克隆體根據(jù)具體需求改為特定的人。
特點:這種不通過new關(guān)鍵字產(chǎn)生一個對象在扰,而是通過對象復(fù)制來實現(xiàn)的模式叫原型模式
原型模式通用類圖:
原型模式的核心是實現(xiàn)Cloneable接口缕减,重寫Clone方法,通過該方法進行對象的拷貝芒珠。
原型模式通用源碼:
public class PrototypeClass implements Cloneable {
PrototypeClass(){
System.out.println("構(gòu)造函數(shù)被執(zhí)行");
}
//重寫Object的Clone方法
@Override
public PrototypeClass clone() {
PrototypeClass prototypeClass = null;
try {
prototypeClass = (PrototypeClass)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototypeClass;
}
}
原型模式的優(yōu)點:
①性能優(yōu)良:原型模式是在內(nèi)存二進制流的拷貝桥狡,要比直接new一個對象性能好很多。
②逃避構(gòu)造函數(shù)的約束皱卓,直接在內(nèi)存中拷貝裹芝,是不會執(zhí)行構(gòu)造函數(shù)的。
原型模式使用場景:
①資源優(yōu)化場景:因原型模式的性能優(yōu)良娜汁,可以在類初始化等場景使用
②性能與安全要求:new一個對象需要非常繁瑣的數(shù)據(jù)準備或權(quán)限訪問嫂易,因此可以使用原型模式。
③一個對象多個修改者:一個對象需要提供給其他對象訪問存炮,并且其他對象可能修改這個對象的值時炬搭,可以考慮使用原型模式拷貝多個對象供調(diào)用者使用蜈漓。
原型模式注意事項:
①構(gòu)造函數(shù)不會被執(zhí)行
看如下代碼
public class Client {
public static void main(String[] args) {
System.out.println("進入main方法"); ----- ①
PrototypeClass prototype = new PrototypeClass(); ----- ②
System.out.println("進入Clone方法"); ----- ③
PrototypeClass prototypeClone = prototype.clone(); -----④
}
}
---------output------------
進入main方法
構(gòu)造函數(shù)被執(zhí)行
進入Clone方法
只有①②③有輸出,第④步中的構(gòu)造函數(shù)并沒有被執(zhí)行
Object類的Clone方法的原理是在內(nèi)存中(具體來講是堆內(nèi)存)以二進制流的方式進行拷貝宫盔,重新分配一個內(nèi)存塊融虽,那構(gòu)造函數(shù)就不會被執(zhí)行。
②深拷貝與淺拷貝問題
Object類提供的方法Clone只是拷貝本對象灼芭,其對象內(nèi)部的數(shù)組有额,引用對象等都不拷貝钞翔,還是指向原生對象的內(nèi)部元素地址胀滚,這種拷貝叫淺拷貝。反之就是深拷貝孔飒。
③clone與final
使用clone方法寄悯,就不能在類的成員變量上增加final關(guān)鍵字萤衰。
參考書籍:設(shè)計模式之禪 --- 秦小波 著