本文共 3742 字,大约阅读时间需要 12 分钟。
原型模式(Prototype Pattern)是一种软件设计模式,允许你通过复制现有的对象来创建新对象,而不必重新编写代码。这个模式特别适用于需要多次创建对象的情况,能够有效减少代码冗余。
在Java中,实现Cloneable接口并重写clone方法是使用原型模式的关键步骤。通过这种方式,类可以定义自己的复制机制,而不是直接继承自Object类的clone方法。
在原型模式中,复制对象的方式分为浅拷贝和深拷贝两种:
浅拷贝:
cloneVideo.publishTime 只是指向了原 video 的 publishTime。深拷贝:
Video 类的 clone 方法中,publishTime 被深拷贝后独立于原对象。package prototype.shallow;import java.util.Date;public class Video implements Cloneable { private String name; private Date publishTime; public Video(String name, Date publishTime) { this.name = name; this.publishTime = publishTime; } public Video() {} public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getPublishTime() { return publishTime; } public void setPublishTime(Date publishTime) { this.publishTime = publishTime; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Video [name=" + name + ", publishTime=" + publishTime + "]"; }} package prototype.shallow;import java.util.Date;public class Main { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(); Video video = new Video("VideoName", date); Video cloneVideo = (Video) video.clone(); System.out.println(video); // 输出: Video [name=VideoName, publishTime=当前时间] System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=当前时间] date.setTime(1231241); System.out.println(video); // 输出: Video [name=VideoName, publishTime=修改后的时间] System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=修改后的时间] }} package prototype.deep;import java.util.Date;public class Video implements Cloneable { private String name; private Date publishTime; public Video(String name, Date publishTime) { this.name = name; this.publishTime = publishTime; } public Video() {} public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getPublishTime() { return publishTime; } public void setPublishTime(Date publishTime) { this.publishTime = publishTime; } @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); Video v = (Video) obj; v.publishTime = (Date) this.publishTime.clone(); return obj; } @Override public String toString() { return "Video [name=" + name + ", publishTime=" + publishTime + "]"; }} package prototype.deep;import java.util.Date;public class Main { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(); Video video = new Video("VideoName", date); Video cloneVideo = (Video) video.clone(); System.out.println(video); // 输出: Video [name=VideoName, publishTime=当前时间] System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=当前时间] date.setTime(1231241); System.out.println(video); // 输出: Video [name=VideoName, publishTime=修改后的时间] System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=修改后的时间] }} 通过实现 Cloneable 接口并重写 clone 方法,你可以在代码中轻松实现对象的复制。浅拷贝和深拷贝的区别在于,浅拷贝只复制对象的引用,而深拷贝复制对象的所有属性,包括对象的引用属性。在实际开发中,选择使用浅拷贝还是深拷贝取决于对象的复杂度和设计需求。
转载地址:http://wssl.baihongyu.com/