package factory.prototype.Demo01; import java.util.Date; //客户端 实现克隆 // public class Bili { public static void main(String[] args) throws CloneNotSupportedException { //原型对象 Date date = new Date(); Video v1 = new Video("来呀", date); Video v2 = (Video) v1.clone(); System.out.println("v1=>"+v1); System.out.println("v2=>"+v2); System.out.println("======================="); date.setTime(1232132132); System.out.println("v1=>"+v1); System.out.println("v2=>"+v2); } } /* // v1可以克隆 v2 Video v2 = (Video) v1.clone(); //克隆出来的对象和原来的一模一样 System.out.println("v2=>"+v2); System.out.println("v2=>hash:"+v2.hashCode()); v2.setName("clone:哈呀!"); System.out.println(v2); */
运行发现:v2完全克隆了v1的信息。但是v1 v2指向了同一个date 如果改变了date的值, v1发生了改变 v2也会发生改变
package factory.prototype.demo02; import java.util.Date; /* 怎样实现克隆 1、实现一个接口 Cloneable 2、重写一个方法 clone() */ //Video: 视频原型 public class Video implements Cloneable {//无良,克隆他人作品 private String name; private Date createTime; //改变克隆的方法 @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); Video v = (Video) obj; //实现深克隆 除此以外还可以进行序列化 反序列化 v.createTime = (Date) this.createTime.clone();//将这个对象的属性也进行克隆 return obj; } public Video() { } public Video(String name, Date createTime) { this.name = name; this.createTime = createTime; } 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 + ‘}‘; } }
创建型模式到此结束!
原文:https://www.cnblogs.com/yppaopao/p/13167989.html