在这一节里,https://blog.csdn.net/weixin_45806131/article/details/109282894
是一个浅拷贝,v1和v2同时指向date,
写个例子:
package prototype;
import java.util.Date;
//客户端
public class Bilibili {
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(123456);
System.out.println("v1 = " + v1);
System.out.println("v2 = " + v2);
}
}
说明v1改变了,v2作为v1的引用,也变化了,这就是一个浅拷贝
理论上应该v2也有一个自己的date,也就是进行一个深拷贝,比如像是这种
解决方法:
将对象的属性也进行克隆
package prototype1;
import java.util.Date;
public class Video implements Cloneable {
private String name;
private Date creatTime;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
Video v = (Video) obj;
//将这个对象的属性也进行克隆,可以实现深克隆,除了这个方法,还可以序列化和反序列化
v.creatTime = (Date)this.creatTime.clone();
return obj;
}
public Video() {
}
public Video(String name, Date creatTime) {
this.name = name;
this.creatTime = creatTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreatTime() {
return creatTime;
}
public void setCreatTime(Date creatTime) {
this.creatTime = creatTime;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", creatTime=" + creatTime +
'}';
}
}
再重新跑一下原来的方法:
package prototype1;
import java.util.Date;
//客户端
public class Bilibili {
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(123456);
System.out.println("v1 = " + v1);
System.out.println("v2 = " + v2);
}
}
发现v1改变了,但是v2还是原来的数值,也就是实现了深克隆
原型模式也会和其他模式一起去使用,比如工厂模式,之前工厂模式中是利用new来创建的,也可以通过原型模式克隆来实现
创建型模式就是这么几种:单例模式,工厂模式,抽象工厂模式,建造者模式以及原型模式
好了,今天就到这里~