参考:
1、史上最全设计模式
2、https://www.cnblogs.com/zhangtianq/p/6006120.html
所谓的原型模式就是就是克隆模式,把原有的对象克隆出一个新的对象,这里克隆有浅克隆和深克隆之分。
浅克隆对于目录对象中的引用类型(比如其它以对象实例、集合等)为共用,改变其中一个都会影响所有克隆出来的对象。
如下图:
原型设计模式结构图如下:
具备原型模式的类所有实现原型类的clone方法,对java来说,Object对象中已有clone方法,子类覆盖即可,同时实现cloneable标识接口。
package com.ztq.prototype;
import java.util.Date;
//浅克隆
@Data
public class Sheep implements Cloneable{
private String sname;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone(); //直接调用Object对象的clone()方法
return obj;
}
}
上面的浅克隆方法,改变birthday将影响所有克隆出来的对象。
下面是深克隆:
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone(); //直接调用Object对象的clone()方法
//添加如下代码实现深复制
Sheep s = (Sheep)obj;
s.birthday = (Date)this.birthday.clone();
return obj;
}
上面的方式缺点就是如果有太多的引用成员会写很多上面类似的代码,所以更好的方式是使用下面的方式实现深克隆。(采用对象序列化的方式,这里需要注意,序列化的对象需要实现 Serializable 标识接口)
@Override
protected Object clone() throws CloneNotSupportedException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(s1);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject(); //克隆好的对象
}