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