原型模式,即指定类实现Cloneable接口,覆写clone方法。在创建对象时,先new产生一个对象,其余对象均由clone()方法产生。
优点:
1、由于clone()方法直接是从内存中复制原对象的二进制流,所以性能上比直接new一个对象好很多,适合在循环体内产生大批量对象。
2、clone()方法生成对象时不会执行构造函数,摆脱了构造函数的约束。这既是优点也是缺点。
使用场景:
1、资源优化场景。类初始化需要消耗非常多的资源。
2、性能和安全场景。通过new一个对象需要非常复杂和繁琐的数据准备或访问权限,则可以使用原型模式
3、一个对象被多人修改。当一个对象需要被多人修改时,则可以考虑使用原型模式拷贝这个对象供修改者使用。
浅拷贝和深拷贝:
浅拷贝就是覆写的clone方法中只调用object的clone()方法拷贝生成新对象,由于拷贝时只会拷贝基本类型的成员变量,引用类型或者数组的成员变量只会拷贝引用地址,这就导致了在修改拷贝对象的非基本类型的成员变量时,原对象的对应成员变量也会更改。
深拷贝就是clone()方法中除了调用clone()方法生成新对象,引用类型或者数组的成员变量也调用clone方法。
public class Thing implements Cloneable{
private ArrayList list = new ArrayList();
public ArrayList getList(){
return this.list;
}
public void setList(String value) {
this.list.add(value);
}
@Override
public Thing clone() {
Thing thing = null;
try {
thing = (Thing)super.clone();
//深拷贝
thing.list = (ArrayList<String>)this.list.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return thing;
}
}