原型模式的定义: 用原型实例创建对象的种类,并且通过复制这些原型创建新的对象
原型模式涉及的三个角色:
当拷贝对象时,拷贝的对象只包含简单的数据类型,或不可变对象时,就直接将这些字段复制到新对象中 但是如果拷贝对象中包含引用对象时,只拷贝引用对象的地址而不拷贝整个被引用的对象被称为浅拷贝,如果新开辟一块内存区域,将整个引用对象都拷贝一份,我们称之为深拷贝。
Client 角色
public class Client {
public Prototype UsePrototypeColonePrototype(Prototype example) {
Prototype pro = example.clone();
return pro;
}
}
Prototype 角色
public interface Prototype extends Cloneable{
public Prototype clone();
}
Concrete Prototype 角色
public class ConcretePrototype implements Prototype {
@Override
public ConcretePrototype clone() {
ConcretePrototype prototype = null;
try {
prototype = (ConcretePrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
之前说过有深拷贝和浅拷贝,那么他们之间究竟在实现上有何区别。其实Object 类自带的 clone 方法便是浅拷贝。
那么我们该如何实现深拷贝呢。小伙伴注意了,我们在实现 Prototype 角色,使其继承了 Cloneable 接口,并让其子类重写其中的 clone 方法。那么我们可以在 充写的 clone 方法中实现引用方法的 clone。
public class ConcretePrototype implements Prototype {
private ArrayList<String> sl = null;
@Override
public ConcretePrototype clone() {
ConcretePrototype prototype = null;
try {
prototype = (ConcretePrototype) super.clone();
prototype.setSl((ArrayList<String>)this.sl.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
public ArrayList<String> getSl() {
return sl;
}
public void setSl(ArrayList<String> sl) {
this.sl = sl;
}
}
当然,除此之外我们也可以采用序列化的方式来实现深克隆。
优点:
原型模式的使用场景: