
本文共 4234 字,大约阅读时间需要 14 分钟。
原型模式(Prototype Pattern)是一种常用的软件设计模式。它的核心思想是通过复制现有对象的行为和属性,来创建新的对象。这种方法特别适用于那些需要生成多个不同时类型或不同时版本对象的情况。在开发过程中,一旦类结构已经确定,使用原型模式可以减少对象的创建时间。
原型模式的结构通常包括两个部分:一个抽象的Prototype类,这个类包含一个Clone方法,声明返回一个该对象的拷贝;以及具体实现该模式的ConcretePrototype类,它们通过实现Clone方法来生成具体对象的拷贝。
###浅度复制示例
假设我们需要创建一个简历类,并生成两份不同的简历。我们的简历类需要能够支持复制,深度和浅度复制都需要考虑。
package prototype.pattern;public class ResumeShallow implements Cloneable { private String mName = null; private String mSex = null; private String mAge = null; private String mWork_time = null; private String mWork_compony = null; public ResumeShallow(String name) { this.mName = name; } public void setPersonalInfo(String sex, String age) { this.mSex = sex; this.mAge = age; } public void setWorkExperience(String work_time, String compony) { this.mWork_time = work_time; this.mWork_compony = compony; } public void display() { System.out.println("Name :" + mName + ",Sex:" + mSex + ",Age:" + mAge); System.out.println("Work experience: " + mWork_time + ", " + mWork_compony); } @Override protected ResumeShallow clone() throws CloneNotSupportedException { return (ResumeShallow) super.clone(); }}
客户端代码,展示浅复制的使用:
public static void main(String[] args) throws CloneNotSupportedException { ResumeShallow rA = new ResumeShallow("大牛"); rA.setPersonalInfo("男", "26"); rA.setWorkExperience("2015-2016", "QQ 企业"); ResumeShallow rB = (ResumeShallow) rA.clone(); rB.setPersonalInfo("女", "25"); rB.setWorkExperience("2012-2014", "WW 企业"); rA.display(); rB.display();}
运行输出结果:
Name :大牛,Sex:男,Age:26Work experience: 2015-2016, QQ 企业Name :大牛,Sex:女,Age:25Work experience: 2012-2014, WW 企业
###深度复制示例
在实际应用中,复杂对象的属性可能本身也都是对象。我们需要一种深度复制的方式来确保所有层次的对象都被复制。
package prototype.pattern;public class WorkExperience implements Cloneable { private String mWork_time = null; private String mWork_compony = null; @Override protected WorkExperience clone() throws CloneNotSupportedException { return (WorkExperience) super.clone(); }}public class ResumeDeep implements Cloneable { private String mName = null; private String mSex = null; private String mAge = null; private WorkExperience mWorkExperience = null; public ResumeDeep(String name) { this.mName = name; this.mWorkExperience = new WorkExperience(); } public ResumeDeep(WorkExperience workExperience) throws CloneNotSupportedException { // 复制工作经验 this.mWorkExperience = (WorkExperience) workExperience.clone(); } public void setPersonalInfo(String sex, String age) { this.mSex = sex; this.mAge = age; } public void setWorkExperience(String work_time, String compony) { this.mWorkExperience.setmWork_time(work_time); this.mWorkExperience.setmWork_compony(compony); } public void display() { System.out.println("Name :" + mName + ",Sex:" + mSex + ",Age:" + mAge); System.out.println("Work experience: " + mWorkExperience.getmWork_time() + ", " + mWorkExperience.getmWork_compony()); } @Override protected ResumeDeep clone() throws CloneNotSupportedException { ResumeDeep resumeDeep = new ResumeDeep(mWorkExperience); resumeDeep.mName = this.mName; resumeDeep.mSex = this.mSex; resumeDeep.mAge = this.mAge; return resumeDeep; }}
客户端代码,展示深度复制的使用:
public static void main(String[] args) throws CloneNotSupportedException { ResumeDeep rA = new ResumeDeep("大牛"); rA.setPersonalInfo("男", "26"); rA.setWorkExperience("2015-2016", "QQ 企业"); ResumeDeep rB = (ResumeDeep) rA.clone(); rB.setPersonalInfo("女", "25"); rB.setWorkExperience("2012-2014", "WW 企业"); rA.display(); rB.display();}
运行输出结果:
Name :大牛,Sex:男,Age:26Work experience: 2015-2016, QQ 企业Name :大牛,Sex:女,Age:25Work experience: 2012-2014, WW 企业
###总结
通过以上示例,可以看出,原型模式在复制对象时,通过实现Cloneable接口和复制方法,可以轻松创建对象的拷贝。在浅复制中,只有基本类型和String类型会被复制;在深复制中,一切引用类型都会被克隆,确保拷贝的对象是独立的。
这种设计模式特别适合需要多个不同时类型或不同时版本的对象生成,而不需要深入了解对象的创建细节的情况。在Java中,所有对象都继承自Object类,已经支持原型模式。任何实现了Cloneable接口的类都可以使用clone()
方法进行浅复制或深复制。
如果需要更复杂的引用类型的深度复制,或者如果你需要复制包含许多嵌套对象的对象,建议使用合适的序列化库或互不可浓的概念来确保正确性的深度复制。
通过这些示例和理解,原型模式如何在软件开发中节省时间和资源,成为设计模式中一个非常实用的工具。
发表评论
最新留言
关于作者
