用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
public interface Prototype {
public Prototype clone();
}
public class ConcretePrototype1 implements Prototype {
public Prototype clone() {
Prototype prototype = new ConcretePrototype1();
return prototype;
}
}
public class ConcretePrototype2 implements Prototype {
public Prototype clone() {
Prototype prototype = new ConcretePrototype2();
return prototype;
}
}
客户端:
public class Client {
private Prototype prototype;
public Client(Prototype prototype) {
this.prototype = prototype;
}
public void operation() {
Prototype newPrototype = prototype.clone();
}
}
需要克隆功能的类,只需要实现Cloneable接口。
super.clone():创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。
如果字段是引用类型的,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。
浅复制(浅度克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制(深度克隆):把引用对象的变量指向复制过的新对象而不是原有的被引用的对象。
数据集对象DataSet,它的clone()方法用来复制DataSet的结构,但不复制DataSet的数据。
obj.setProduct((Product)this.product.clone());
最大的缺点是每个原型的子类都必须实现clone的操作,尤其在包含引用类型的对象时,clone方法会比较麻烦,必须要能够递归地让所有的相关对象都要正确地实现克隆。
public interface Prototype {
public Prototype clone();
}
public class ConcretePrototype1 implements Prototype {
public Prototype clone() {
Prototype prototype = new ConcretePrototype1();
return prototype;
}
}
public class ConcretePrototype2 implements Prototype {
public Prototype clone() {
Prototype prototype = new ConcretePrototype2();
return prototype;
}
}
客户端:
public class Client {
private Prototype prototype;
public Client(Prototype prototype) {
this.prototype = prototype;
}
public void operation() {
Prototype newPrototype = prototype.clone();
}
}
需要克隆功能的类,只需要实现Cloneable接口。
super.clone():创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。
如果字段是引用类型的,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。
浅复制(浅度克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制(深度克隆):把引用对象的变量指向复制过的新对象而不是原有的被引用的对象。
数据集对象DataSet,它的clone()方法用来复制DataSet的结构,但不复制DataSet的数据。
obj.setProduct((Product)this.product.clone());
最大的缺点是每个原型的子类都必须实现clone的操作,尤其在包含引用类型的对象时,clone方法会比较麻烦,必须要能够递归地让所有的相关对象都要正确地实现克隆。