原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
具体操作就是在对象上实现一个Cloneable接口,然后重写clone方法。但是这种方式是浅拷贝,基本数据类型与包装类型以及字符串没有问题,但是对象类型,比如list就会出现引用地址相同的情况,这种深拷贝需要实现Serializable接口,然后通过流的方式重写clone方法。
1.浅拷贝
class PrototypeClass implements Cloneable{
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
2.深拷贝
class PrototypeClass implements Cloneable, Serializable {
private Integer id;
private List<Integer> list;
private StringBuilder str;
public StringBuilder getStr() {
return str;
}
public void setStr(StringBuilder str) {
this.str = str;
}
public List<Integer> getList() {
return list;
}
public void setList(List<Integer> list) {
this.list = list;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
protected Object clone() throws CloneNotSupportedException {
try {
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
PrototypeClass copy=(PrototypeClass) ois.readObject();
return copy;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}