文檔查閱說明:
定義:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象(實際上就是實現Cloneable接口,重寫clone()方法)
使用場景:
● 資源優化場景
類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等。
● 性能和安全要求的場景
通過new產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模式。
● 一個對象多個修改者的場景
一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用
淺拷貝和深拷貝:
淺拷貝:Object類提供的方法clone只是拷貝本對象,其對象內部的數組、引用對象等都不拷貝,還是指向原生對象的內部元素地址,這種拷貝就叫做淺拷貝,其他的原始類型比如int、long、char、string(當做是原始類型)等都會被拷貝。
注意: 使用原型模式時,引用的成員變量必須滿足兩個條件纔不會被拷貝:一是類的成員變量,而不是方法內變量;二是必須是一個可變的引用對象,而不是一個原始類型或不可變對象。
深拷貝:對私有的類變量進行獨立的拷貝,如:thing.arrayList = (ArrayList<String>)this.arrayList.clone();
public abstract class Prototype implements Cloneable {
private String id;
public Prototype(String id) {
super();
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
public class ConCreatePrototype extends Prototype {
public ConCreatePrototype(String id) {
super(id);
}
}
public class Test {
public static void main(String[] args) {
ConCreatePrototype con = new ConCreatePrototype("I");
ConCreatePrototype clone = (ConCreatePrototype) con.clone();
System.out.println(clone.getId());
System.out.println(con == clone);
System.out.println(con.equals(clone));
}
}