原型模式:
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
通俗的来说,就是对象自身提供clone方法,用于克隆一份对象给其他方使用。
好处就是,如果构造函数和初始化过程 非常的复杂的时候,创建对象代价非常大的时候,使用这种模式 可以很方便。
一般在初始化信息不发生变化的情况下,克隆是最好的办法
隐藏了对象创建的细节,又对性能提高,不用重新初始化对象
而是动态的获取对象的运行时的状态。
比如说实现快照读或者快照写,需要拷贝一份原有对象的快照。
但是要注意的是深拷贝和浅拷贝的区别
浅拷贝:
如果字段是值类型,则对该字段逐位复制,如果字段是引用类型,则复制引用但不复制引用对象,因此原始对象及其副本引用同一对象 。
被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍指向原来的对象。
深拷贝:
深拷贝,把引用对象的变量指向复制过的新对象,而不是原来的被引用的对象。
但是千万注意,如果复制的对象 里面又有引用其他对象,然后引用的其他对象再有其他对象的引用,有很多层。 这样的话,要事先就考虑好,复制需要深入多少层,而且要当心循环引用的问题。
拷贝接口
public interface Prototype {
Prototype Clone();
}
实现接口的类
public class PrototypeA implements Prototype {
private String name = "对象A";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Prototype Clone() {
PrototypeA prototype = new PrototypeA();
prototype.setName(this.name);
return prototype;
}
}
使用验证
public static void main(String[] args) {
Prototype prototype1 = new PrototypeA();
System.out.println("prototype1的hashCode" + prototype1);
Prototype prototype2 =prototype1.Clone();
System.out.println("prototype2的hashCode" + prototype2);
}
并且对副本的修改 ,不会影响到原来的对象