原型模式属于创建型模式,适用于对象的创建过程比较复杂或者需要循环创建大量复杂对象的情况。包括【浅克隆】和【深克隆】两种概念。
由于原型模式可以直接复制内存地址,所以比new或构造方法创建对象更高效。
1 浅克隆
浅克隆是指创建的目标对象拷贝原型对象的程度相对较浅。主要体现在其只实际拷贝了基本数据类型、String 以及 引用对象的引用地址,并没有拷贝引用对象的地址值数据。
/**
* 浅拷贝
* Object实现了Cloneable,可以通过clone方法实现浅拷贝
*/
public class ShallowPrototype implements Cloneable {
private Integer a;
private String b;
private List<String> c;
@Override
public ShallowPrototype clone() {
// 这个操作对“List<String> c”只拷贝了它的引用地址,没有拷贝实际的地址值数据。
return (ShallowPrototype)super.clone();
}
}
2 深克隆
深拷贝相对浅拷贝的概念而言,增加了引用地址值数据的拷贝,其拷贝的动作更彻底。
/**
* 深拷贝
* 通过写读内存实现对象的深拷贝
*/
public class DeepPrototype implements Serializable {
private Integer a;
private String b;
private List<String> c;
public DeepPrototype deepClone() {
// 写内存
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writerObject(this);
// 读内存
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (DeepPrototype)ois.readObject(ois);
}
}