设计模式6——原型模式
package com.ghl.prototype.demo01;
import javax.xml.crypto.Data;
import java.util.Date;
/**
* @ProjectName DesignPattern
* @ClassName video
* @Date 2020/8/26 22:24
* @Author gaohengli
* @Version 1.0
*/
/*
1.实现一个类 Cloneable
2.重写一个方法 clone()
*/
//原型模式
//克隆别人的视频
public class Video implements Cloneable {
private String name;
private Date createTime;
//重写克隆方法
@Override
protected Object clone() throws CloneNotSupportedException {
//浅克隆
//return super.clone();
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 +
'}';
}
}
package com.ghl.prototype.demo01;
import java.util.Date;
/**
* @ProjectName DesignPattern
* @ClassName BiliBili
* @Date 2020/8/26 22:30
* @Author gaohengli
* @Version 1.0
*/
//客户端,克隆
public class BiliBili {
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象v1
Date date = new Date();//当前日期
Video v1 = new Video("ghl", date);
System.out.println("v1="+v1);
System.out.println("v1的hash:"+v1.hashCode());
//v1克隆v2
Video v2 = (Video) v1.clone();
System.out.println("v2="+v2);
System.out.println("v2的hash:"+v2.hashCode());
//修改克隆的对象
v2.setName("clone:ghl");
System.out.println("修改后的v2:"+v2);
//浅克隆(日期更改后,clone出来的实例的日期也会更改,未完全成为一个独立个体)
//深客隆(深克隆还可以使用序列化,反序列化实现)
System.out.println("v1->"+v1);
System.out.println("v2->"+v2);
date.setTime(2222);
System.out.println("v1->"+v1);
System.out.println("v2->"+v2);
}
}
浅克隆:
深克隆: