您好,登錄后才能下訂單哦!
原型模式(Prototype Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它允許通過復(fù)制(或克?。┮粋€(gè)現(xiàn)有對(duì)象來創(chuàng)建一個(gè)新對(duì)象,而無需重新實(shí)例化它。這種模式在Java中可以通過實(shí)現(xiàn)Cloneable
接口和重寫clone()
方法來實(shí)現(xiàn)深拷貝(Deep Copy)和淺拷貝(Shallow Copy)。
淺拷貝(Shallow Copy):
Cloneable
接口并重寫clone()
方法來實(shí)現(xiàn)淺拷貝。但需要注意的是,clone()
方法默認(rèn)執(zhí)行的是淺拷貝,需要開發(fā)者手動(dòng)實(shí)現(xiàn)深拷貝邏輯。public class ShallowCopyExample implements Cloneable {
private int[] data;
public ShallowCopyExample(int[] data) {
this.data = data;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
在這個(gè)例子中,ShallowCopyExample
類實(shí)現(xiàn)了Cloneable
接口并重寫了clone()
方法。但是,由于data
字段是一個(gè)數(shù)組,它仍然指向同一個(gè)內(nèi)存地址,因此執(zhí)行的是淺拷貝。
2. 深拷貝(Deep Copy):
* 深拷貝創(chuàng)建一個(gè)新對(duì)象,并遞歸地拷貝原始對(duì)象中的所有引用類型字段。這意味著新對(duì)象和原始對(duì)象的引用類型字段將指向不同的內(nèi)存地址。
* 在Java中,實(shí)現(xiàn)深拷貝通常需要自定義拷貝邏輯,而不是簡單地重寫`clone()`方法??梢酝ㄟ^序列化和反序列化的方式來實(shí)現(xiàn)深拷貝,因?yàn)樾蛄谢瘯?huì)創(chuàng)建對(duì)象的深度副本。
* 例如:
public class DeepCopyExample implements Serializable {
private int[] data;
public DeepCopyExample(int[] data) {
this.data = data;
}
public DeepCopyExample deepCopy() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (DeepCopyExample) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("Deep copy failed", e);
}
}
}
在這個(gè)例子中,DeepCopyExample
類實(shí)現(xiàn)了Serializable
接口,并重寫了一個(gè)deepCopy()
方法。這個(gè)方法使用序列化和反序列化的技術(shù)來創(chuàng)建對(duì)象的深度副本。
總結(jié):
Cloneable
接口并重寫clone()
方法來實(shí)現(xiàn)淺拷貝;通過序列化和反序列化的方式來實(shí)現(xiàn)深拷貝。免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。