java 原型模式
Java原型模式 :通俗易懂的叫复制,通过复制得到一个一模一样的对象。
浅克隆
内容完全复制,如果存在引用类型的话指向的是同一个对象的(地址)
原理图
因为克隆是直接复制的对象的内容,
当对象的成员是引用类型时(也就是传进来的是个地址)
就会出现当引用的内容改变时复制对象和被复制对象的引用类型的值都会改变
直接上代码
```java
package prototype;
import javax.xml.crypto.Data;
import java.util.Date;
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();//浅复制
}
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.nwk.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) date);
System.out.println("v1=>"+v1);
System.out.println("v1=>hash:"+v1.hashCode());
Video v2 = (Video) v1.clone();
System.out.println("v2=>"+v2);
System.out.println("v2=>hash:"+v2.hashCode());
v2.setName("一花一世界");
System.out.println("v2=>"+v2);
date.setTime(12345678);
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
}
}
运行结果
v1=>Video{name='一叶一菩提', createTime=Sun Sep 27 09:56:07 CST 2020}
v1=>hash:683287027
v2=>Video{name='一叶一菩提', createTime=Sun Sep 27 09:56:07 CST 2020}
v2=>hash:1766822961
v2=>Video{name='一花一世界', createTime=Sun Sep 27 09:56:07 CST 2020}
v1=>Video{name='一叶一菩提', createTime=Thu Jan 01 11:25:45 CST 1970}
v2=>Video{name='一花一世界', createTime=Thu Jan 01 11:25:45 CST 1970}
深克隆
内容和引用内容完全复制,如果存在引用类型的话指向的是不同的对象的(地址)
原理图
在复制内容的时候,如果存在引用行的对象时把引用型的内容也复制来
修改后的代码
package prototype;
import javax.xml.crypto.Data;
import java.util.Date;
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
//这里是修改的内容
Object obj = super.clone();
Video video=(Video) obj;
video.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 +
'}';
}
}
运行结果
v1=>Video{name='一叶一菩提', createTime=Sun Sep 27 11:00:40 CST 2020}
v1=>hash:1836019240
v2=>Video{name='一叶一菩提', createTime=Sun Sep 27 11:00:40 CST 2020}
v2=>hash:325040804
v2=>Video{name='一花一世界', createTime=Sun Sep 27 11:00:40 CST 2020}
v1=>Video{name='一叶一菩提', createTime=Thu Jan 01 11:25:45 CST 1970}
v2=>Video{name='一花一世界', createTime=Sun Sep 27 11:00:40 CST 2020}
注意事项,测试包和类要放在一个包里