说白了就是以一个对象为原型,然后克隆出另外一个对象,用来提高程序效率。
一、浅克隆①创建一个类实现Cloneable接口,并重写clone方法
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
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 +
'}';
}
}
②测试
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
//创建一个对象
Video v1 = new Video("正在提升", new 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());
}
}
//打印出来的结果
//v1:Video{name='正在提升', createTime=Fri May 06 11:05:04 CST 2022}
//v1.hash:1735600054
//v2:Video{name='正在提升', createTime=Fri May 06 11:05:04 CST 2022}
//v2.hash:21685669
会发现v2确实克隆了v1,但是他们又是两个不同的对象。
但会存在一个问题,就是它们使用的是同一个Date对象。所以一个对象中的date改变了那么另外一个对象中的date会跟着改变
这种克隆方式属于浅克隆。
方式一:可以使用序列化和反序列化。
方式二:修改一下clone方法
①创建一个对象实现Cloneable接口并重写clone方法
public class Video implements Cloneable{
private String name;
private Date createDate;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
Video v = (Video)obj;
v.createDate=(Date) this.createDate.clone();
return obj;
}
public Video(String name, Date date) {
this.name = name;
this.createDate = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return createDate;
}
public void setDate(Date date) {
this.createDate = date;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createDate=" + createDate +
'}';
}
}
②测试
public class Test {
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(565656566);
System.out.println("v1:"+v1);
System.out.println("v2:"+v2);
}
}
//打印结果
//
//v1:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}
//v2:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}
//========修改时间=======
//v1:Video{name='正在提升', createDate=Wed Jan 07 21:07:36 CST 1970}
//v2:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}
会发现,这种方式就实现了深拷贝。
Spring中的Bean就是使用单列模式,原型模式~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)