一、优点
1.原型模式是在内存二进制流的拷贝,比直接new一个对象性能好很多。
2.直接在内存中拷贝,逃避了构造函数的约束;应用时要注意这点——构造函数是不执行的
二、实例代码
public class PrototypeClass implements Cloneable{
public Object clone() throws CloneNotSupportedException {
PrototypeClass prototype = (PrototypeClass) super.clone();
return prototype;
}
}
三、浅拷贝和深拷贝
Object类提供的clone方法拷贝原始类型(如int,long等),但不拷贝对象内的数组、引用对象,还是指向原生对象的内部元素地址,导致多个对象共享一个变量,这种方式为浅拷贝;如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
//深度拷贝
public class PrototypeDeep implements Cloneable{
private ArrayList<String> list = new ArrayList<String>();
@Override
protected Object clone() throws CloneNotSupportedException {
PrototypeDeep prototy = (PrototypeDeep) super.clone();
list = (ArrayList<String>) this.list.clone();
return prototy;
}
}
四、注意事项
1.通过clone拷贝生成对象时,对象的构造函数不被执行
2.因为clone拷贝生成对象无视构造函数,因此破坏单例实现
3.只有实现了Cloneable接口的类才可以拷贝
4.重写Object对象的clone方法时,其作用域为project,为了方便外部类调用,手动改为publich