一、定義
原型模式就是用原型實例指定創(chuàng)建對象的種類馆衔,并且通過復(fù)制這些原型創(chuàng)建新的對象瘟判。可以說是最簡單的模式了角溃。
二拷获、原型模式結(jié)構(gòu)圖
原型
三、原型模式的實現(xiàn)
public class Prototype implements Cloneable {
private int x;
private int y;
private int z;
public Prototype() {
this.x = 2;
this.y = 3;
this.z = 4;
}
public void change() {
this.x = 9;
this.y = 8;
this.z = 7;
}
public Prototype clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
throw new RuntimeException(exception);
}
return (Prototype) object;
}
public String toString() {
return "[" + x + "," + y + "," + z + "]";
}
public static void main(String[] args) {
Prototype prototype1 = new Prototype();
prototype1.change();
System.out.println(prototype1);
Prototype prototype2 = prototype1.clone();
System.out.println(prototype2);
}
}
輸出結(jié)果:
[9,8,7]
[9,8,7]
從輸出結(jié)果可以看出來减细,clone方法將prototype1復(fù)制了一個匆瓜,然后賦給了prototype2,這就像復(fù)制粘貼一樣未蝌。值得注意的是驮吱,在使用Object.clone()方法去拷貝一個對象時,構(gòu)造方法是不被執(zhí)行的萧吠,否則prototype2實例中x左冬,y,z的值應(yīng)該為2纸型,3拇砰,4才對。
從原型模式的使用方式不難推斷出绊袋,原型模式常使用于以下場景:
1毕匀、對象的創(chuàng)建非常復(fù)雜,可以使用原型模式快捷的創(chuàng)建對象癌别。
2皂岔、在運行過程中不知道對象的具體類型,可使用原型模式創(chuàng)建一個相同類型的對象展姐,或者在運行過程中動態(tài)的獲取到一個對象的狀態(tài)躁垛。
對于clone方法,它執(zhí)行的是淺拷貝圾笨,也就是說如果是引用類型的屬性教馆,則它不會進行拷貝,而是只拷貝引用擂达。
四土铺、優(yōu)點
- 由于clone方法是由虛擬機直接復(fù)制內(nèi)存塊執(zhí)行,所以在速度上比使用new的方式創(chuàng)建對象要快板鬓。
- 可以基于原型悲敷,快速的創(chuàng)建一個對象,而無需知道創(chuàng)建的細節(jié)俭令。
- 可以在運行時動態(tài)的獲取對象的類型以及狀態(tài)后德,從而創(chuàng)建一個對象。
缺點:
然而原型模式的缺點也是相當(dāng)明顯的抄腔,主要的缺點就是實現(xiàn)深度拷貝比較困難瓢湃,需要很多額外的代碼量理张。
五、深拷貝的方式
類似于 反射绵患、反序列化