序列恢复为原来的对象,我们可以利用这一功能来实现轻量级的深复制,但前提是需要复制对象实现Serializable接口。
序列化深复制原型模式
悟空
package com.tirion.design.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class WuKong implements Serializable {
private GoldenCudgel goldenCudgel;
public GoldenCudgel getGoldenCudgel() {
return goldenCudgel;
}
public void setGoldenCudgel(GoldenCudgel goldenCudgel) {
this.goldenCudgel = goldenCudgel;
}
public WuKong() {
goldenCudgel = new GoldenCudgel(false);
}
public WuKong deepClone() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (WuKong) ois.readObject();
}
public static void main(String[] args) throws Exception {
WuKong wuKong = new WuKong();
WuKong wuKongDeepCopy = wuKong.deepClone();
System.out.println("深复制后悟空是否为同一个对象" + (wuKong == wuKongDeepCopy));
System.out.println("深复制后金箍棒是否为同一个对象" + (wuKong.getGoldenCudgel() == wuKongDeepCopy.getGoldenCudgel()));
System.out.println("深复制原对象金箍棒属性为" + wuKong.getGoldenCudgel().isDisappear());
System.out.println("深复制对象金箍棒属性发生改变...");
wuKongDeepCopy.getGoldenCudgel().setDisappear(true);
System.out.println("深复制原对象金箍棒属性为" + wuKong.getGoldenCudgel().isDisappear());
}
}
这时候运行main()方法会报java.io.NotSerializableException,因为序列化对象要求引用对象也必须实现Serializable接口,除非对应属性不需要序列化,所以我们这里需要将金箍棒类也实现序列化接口。
金箍棒
package com.tirion.design.prototype;
import java.io.Serializable;
public class GoldenCudgel implements Serializable {
public GoldenCudgel() {
}
public GoldenCudgel(boolean disappear) {
this.disappear = disappear;
}
private boolean disappear;
public boolean isDisappear() {
return disappear;
}
public void setDisappear(boolean disappear) {
this.disappear = disappear;
}
public boolean equals(GoldenCudgel obj) {
return obj.isDisappear() == disappear;
}
}
执行结果
深复制后悟空是否为同一个对象false
深复制后金箍棒是否为同一个对象false
深复制原对象金箍棒属性为false
深复制对象金箍棒属性发生改变...
深复制原对象金箍棒属性为false
从结果来看,通过序列化实现深复制与通过clone()方法实现深复制的结果是一样的,但是方法却比较简单,我们只需要将需要复制的对象实现序列化接口就可以了。同时java的对象序列化是提供了轻量级持久化的,我们可以通过网络或者磁盘来进行数据的传播及持久化,并且就突破了clone()方法只能本地程序运行期间才能持久化的限制。
关于原型模式的介绍就到这里,你可以将它记忆为身外身模式。
如果你认为文章中哪里有错误或者不足的地方,欢迎在评论区指出,也希望这篇文章对你学习java设计模式能够有所帮助。转载请注明,谢谢。
更多设计模式的介绍请到悟空模式-java设计模式中查看。