定義:以現有的某個範例爲原型,通過複製原型獲得更多相同或相似的物件。
特點:
實現:
原型模式是最建立型設計模式,以現有的範例爲原型,通過複製,高效快速地生成新物件,特別是在一些需要生成大量物件的場景(將大量數據庫數據對映成實體物件時),使用原型模式生成物件要比new的方式更爲高效。原型模式的克隆分爲淺克隆和深克隆,在java中原型類直接實現Cloneable 介面就可實現物件的克隆
1.淺克隆
package design.prototype;
import java.util.Arrays;
public class Prototype implements Cloneable {
private String name;
private String[] strs;
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Prototype ptt = (Prototype) super.clone();
ptt.setName(this.name);
ptt.setStrs(this.strs);
return ptt;
}
public void print() {
System.out.println(this.name + "--" + Arrays.toString(this.strs)+"--"+this.strs.toString());
}
}
2.深克隆
package design.prototype;
import java.util.Arrays;
public class Prototype implements Cloneable {
private String name;
private String[] strs;
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Prototype ptt = (Prototype) super.clone();
ptt.setName(this.name);
ptt.setStrs(this.strs.clone());
return ptt;
}
public void print() {
System.out.println(this.name + "--" + Arrays.toString(this.strs)+"--"+this.strs.toString());
}
}
package design.prototype;
public class Test {
public static void main(String[] args) {
Prototype p1 = new Prototype();
String[] t = { "1", "1" };
p1.setName("l");
p1.setStrs(t);
Prototype p2;
try {
p2 = (Prototype) p1.clone();
p1.print();
p2.print();
// 對p2.進行修改
String[] t1 = p2.getStrs();
t1[0] = "222";
p2.setStrs(t1);
p1.print();
p2.print();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
用上面的Test.java進行測試:
1.淺克隆下的輸出:
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@15db9742
2.深克隆下的輸出:
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[1, 1]--[Ljava.lang.String;@6d06d69c
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@6d06d69c
可以看到,在淺克隆中對於陣列strs 的克隆只是將陣列地址複製到了新物件中,並未建立新的陣列,也就是說淺克隆只克隆你指定的物件,至於你指定的物件內部的物件,它不克隆,還是把參照給你,共用變數。在使用時需注意,如果需要克隆指定的物件內部的物件,那就需要在clone方法內,範例化內部物件或者呼叫內部物件的clone方法