五、原型模式
原型模式(Prototype Pattern): 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
原型模式就像复印技术,根据原对象复印出一个新对象,并根据需求对新对象进行微调
代码举例如下:
/**
* @author liang.peng
* @version 1.0
* @description 用于实现克隆的类
* @since 2022/7/18 15:29
**/
public class Video implements Cloneable {
//添加属性
private String name;
private Date createTime;
//实现clone方法
@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 +
'}';
}
}
实现克隆:
/**
* @author liang.peng
* @version 1.0
* @description 通过Video实现克隆
* @since 2022/7/18 15:34
**/
public class Clone {
public static void main(String[] args) throws CloneNotSupportedException {
//创建一个原型
Date date = new Date();
Video v1 = new Video("你好!!", date);
System.out.println(v1);
System.out.println("v1hash:"+v1.hashCode());
//进行克隆,如果需要创建和V1一样的对象,不需要从新去创建,只需要克隆就可以
Video v2 = (Video) v1.clone();//强制转换一下类型。
System.out.println(v2);
System.out.println("v2hash:"+v2.hashCode());
}
测试结果:
注意:以上克隆方法是有问题的
虽然克隆后结果都看起来差不多,但是v2和v1存在一个问题就是,v1之前使用了date对象,v2其实也指向了同一个date,这只是一种浅克隆,并不能将该对象指向的所有对象都从新拷贝一份。
深度克隆
这里我采用改造克隆方法的方式来实现深度克隆:
这样就可以实现深度的克隆了;