package com.design.prototype;
import java.util.Date;
/**
*
* @author 胡辉
* @date 2018年8月3日
* @version V1.0
*
* 实现原型模式的要求:
* (1)实现runable接口,如果不实现这个接口,在运行时,他会报错 java.lang.CloneNotSupportedException:
* (2)重写clone方法,为什么要重写,因为Object类中的clone方法的作用域是protected
* (3)对于一个对象中如果还存在其他非基本数据类型,如果也要拷贝,那么也需要在clone方法内部拷贝本对象的引用类性的属性。
* (4)对于第三点,为什么引用类属性无法拷贝,这是深拷贝和浅拷贝的原因。
*
*
* 引申:深复制与复制的区别
* 浅复制:被复制的对象与原来有相同的值,除了其它引用类型的变量对于基本数据类型复制数据,
* 对于引用类型只是复制他的引用,引用类型还是复制前的,复制前的对象的该属性变化,复制后的对象一样会随着改变。
*
* 深复制:被复制的对象与原来有相同的值,而且复制后的引用类型的属性将指向新的对象;
*
*/
public class Prototype {
private Date date = new Date();
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//需要独立拷贝 ----深拷贝
prototype.date = (Date) this.date.clone();
return prototype;
}
public static void main(String[] args) throws InterruptedException {
Prototype p1 = new Prototype();
Prototype p2 = p1.clone();
Thread.sleep(2000);
p1.date = new Date();
System.out.println(p1.date+" : "+p2.date);
}
}