用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
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方法会比较麻烦,必须要能够递归地让所有的相关对象都要正确地实现克隆。
本文探讨了原型模式的概念,展示了如何通过实现Cloneable接口和重写clone方法来克隆对象。文章深入分析了浅复制和深复制的区别,以及在不同场景下选择合适复制方式的重要性。同时,通过具体实例,如使用Java实现克隆功能,为读者提供了一个清晰的实践指南。
450

被折叠的 条评论
为什么被折叠?



