使用場景:當通過new產生的一個對象需要非常繁瑣的數據準備或訪問權限時,可以使用原型模式。
類似於java中的克隆技術,以某個對象爲原型,複製出新的對象。新對象與原型對象擁有相同特點。
優勢:效率高,避免了重新執行構造過程的步驟。
與new出來的對象的比較:
new創建新的對象屬性採用的是默認值。克隆出的對象的屬性值完全和原型對象相同。
克隆出的新對象改變不會影響原型對象,並且修改克隆對象的值不影響原型對象。
淺複製:修改原型和克隆修改任意一個對象的屬性,都影響對方,因爲2個內存地址值指向同一對象
public class LightPrototype implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "LightPrototype [name=" + name + "]";
}
public LightPrototype(String name) {
super();
this.name = name;
}
public LightPrototype() {
super();
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object o = super.clone();
return o;
}
}
深複製:修改原型和克隆修改任意一個對象的屬性,不影響其他對象的屬性值
public class DeepPrototype implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DeepPrototype [name=" + name + "]";
}
public DeepPrototype(String name) {
super();
this.name = name;
}
public DeepPrototype() {
super();
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object o = super.clone();
DeepPrototype d = (DeepPrototype)o;
d.name = (String) this.name.clone();
return o;
}
}