原型模式就是相当于克隆复制:而原型模式里分为浅克隆和深克隆,浅克隆把地址值也克隆了,他们都指向同一个地址值。这样的话原来的对象属性修改后被克隆的属性也会跟着修改这不是想要的效果。而深克隆的话就是把对象里的属性也调用克隆的方法,这样的话对象里面的属性修改后克隆出来的对象不会改变。
浅克隆:首先创建一个对象里面有两个属性,提供get、set方法,有参构造和无参构造和tostroing方法再实现一个接口 Cloneable 重写clone()方法
public class Video implements Cloneable{//克隆别人的视频 private String name; private Date createTime; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public Video(String name, Date createTime) { this.name = name; this.createTime = createTime; } public Video() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } @Override public String toString() { return "Video{" + "name='" + name + '\'' + ", createTime=" + createTime + '}'; } }
public static void main(String[] args) throws CloneNotSupportedException { //原型对象 v1 Date date = new Date(); Video v1 = new Video("黄巨强学java", date); System.out.println("v1=>"+v1); System.out.println("v1=hashCode>"+v1.hashCode()); //v1克隆v2出来 Video v2 = (Video) v1.clone(); System.out.println("v2=>"+v1); System.out.println("v2=hashCode>"+v1.hashCode()); v2.setName("黄巨强学模式"); System.out.println(v2); //浅克隆,地址值都是引用同一个 }
深克隆:在原有的clone()方法上把他的属性也调用克隆方法
@Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); Video v = (Video) obj; v.createTime = (Date) this.createTime.clone(); //实现深克隆 return obj; }
public static void main(String[] args) throws CloneNotSupportedException { //原型对象 v1 Date date = new Date(); Video v1 = new Video("黄巨强学java", date); //v1克隆v2出来 Video v2 = (Video) v1.clone(); System.out.println("v1=>"+v1); System.out.println("v1=>"+v2); System.out.println("*****************************"); date.setTime(123456); System.out.println("v1=>"+v1); System.out.println("v1=>"+v2); }