原型模式
原型模式
克隆,Cloneable,clone()
浅克隆
原型类
/*
* 原型类
* 1.实现Cloneable
* 2.重写clone方法
* */
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 +
'}';
}
}
测试
/*
* 浅克隆
* 1.对象内容一样
* 2.hash不一样,不是同一个对象
* */
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 + " hash" + v1.hashCode());
System.out.println(v2 + " hash" + v2.hashCode());
date.setTime(2633333);
System.out.println("=======原型的date改变后======");
//发行v1的date改变后,v2的date也改变了,浅克隆
System.out.println(v1 + " hash" + v1.hashCode());
System.out.println(v2 + " hash" + v2.hashCode());
/*
* Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash1735600054
* Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash21685669
* =======原型的date改变后======
* Video{name='黑客帝国', createTime=Thu Jan 01 08:00:26 CST 1970} hash1735600054
* Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash21685669
* */
}
}
深克隆方式1
对象的每一个属性都要克隆
原型类
/*
* 原型类
* 1.实现Cloneable
* 2.重写clone方法,自定义克隆代码
* */
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;
//对象属性也进行克隆
Date date = (Date) this.createTime.clone();
video.setCreateTime(date);
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 +
'}';
}
}
测试
/*
* 深克隆 方法1
* */
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 + " hash" + v1.hashCode());
System.out.println(v2 + " hash" + v2.hashCode());
date.setTime(2633333);
System.out.println("=======原型的date改变后======");
//达到预期结果,原型属性改变不在影响克隆对象
System.out.println(v1 + " hash" + v1.hashCode());
System.out.println(v2 + " hash" + v2.hashCode());
/*
Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash1735600054
Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash21685669
=======原型的date改变后======
Video{name='黑客帝国', createTime=Thu Jan 01 08:43:53 CST 1970} hash1735600054
Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash21685669
* */
}
}
深克隆方式2
实现Serializable接口,通过对象的序列化和反序列化实现克隆
原型类
/*
* 原型类
* 1.实现Cloneable
* 2.重写clone方法,自定义克隆代码
* */
public class Video implements Serializable {
private String name;
private Date createTime;
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 +
'}';
}
}
克隆工具类
public class CloneUtil {
//克隆方法:序列化和反序列化
public static Object clone(Object o) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);//把要克隆的对象写进流
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
}
测试
/*
* 深克隆方法2:序列化,反序列化,原型实现Serializable
* */
public class Test {
public static void main(String[] args) throws Exception {
Date date = new Date();
Video v1 = new Video("黑客帝国", date);
Video v2 = (Video) CloneUtil.clone(v1);
System.out.println(v1);
System.out.println(v2);
date.setTime(2326262);
System.out.println("=======v1属性date改变后=======");
//克隆的对象不随原型对象改变而改变
System.out.println(v1);
System.out.println(v2);
/*
* Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
* Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
* =======v1属性date改变后=======
* Video{name='黑客帝国', createTime=Thu Jan 01 08:38:46 CST 1970}
* Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
* */
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY