一、原型模式:用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
浅复制:
代码
@Data public class WorkExperience { private String workDate; private String company; } @Data public class Resume implements Cloneable { private String name; private String sex; private String age; private WorkExperience workExperience; public Resume(String name){ this.name = name; workExperience = new WorkExperience(); } public void setPersonalInfo(String sex, String age){ this.sex = sex; this.age = age; } public void setWorkExperience(String workDate, String company){ workExperience.setCompany(company); workExperience.setWorkDate(workDate); } public void display(){ System.out.println("name = " + name + ",sex = " + sex + ",age = " + age); System.out.println("工作经历:" + workExperience.getWorkDate() + "-" + workExperience.getCompany()); } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Test { public static void main(String[] args) throws CloneNotSupportedException { Resume resumeA = new Resume("杨过"); resumeA.setPersonalInfo("M","29"); resumeA.setWorkExperience("2020-04-03","阿里巴巴"); Resume resumeB = (Resume) resumeA.clone(); resumeB.setWorkExperience("2020-01-01","腾讯"); Resume resumeC = (Resume) resumeA.clone(); resumeC.setPersonalInfo("F","24"); resumeA.display(); resumeB.display(); resumeC.display(); /** * 运行结果(三个引用都是最后一次设置的值,因为三个引用都指向了一个对象) * * name = 杨过,sex = M,age = 29 * 工作经历:2020-01-01-腾讯 * name = 杨过,sex = M,age = 29 * 工作经历:2020-01-01-腾讯 * name = 杨过,sex = F,age = 24 * 工作经历:2020-01-01-腾讯 */ } }
深复制:
@Data public class WorkExperience implements Cloneable{ private String workDate; private String company; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } @Data public class Resume implements Cloneable { private String name; private String sex; private String age; private WorkExperience workExperience; public Resume(String name){ this.name = name; workExperience = new WorkExperience(); } public Resume(WorkExperience workExperience) throws CloneNotSupportedException { this.workExperience = (WorkExperience) workExperience.clone(); } public void setPersonalInfo(String sex, String age){ this.sex = sex; this.age = age; } public void setWorkExperience(String workDate, String company){ workExperience.setCompany(company); workExperience.setWorkDate(workDate); } public void display(){ System.out.println("name = " + name + ",sex = " + sex + ",age = " + age); System.out.println("工作经历:" + workExperience.getWorkDate() + "-" + workExperience.getCompany()); } /*@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }*/ protected Object clone() throws CloneNotSupportedException { Resume resume = new Resume(this.workExperience); resume.name = this.name; resume.sex = this.sex; resume.age = this.age; return resume; } } public class Test { public static void main(String[] args) throws CloneNotSupportedException { Resume resumeA = new Resume("杨过"); resumeA.setPersonalInfo("M","29"); resumeA.setWorkExperience("2020-04-03","阿里巴巴"); Resume resumeB = (Resume) resumeA.clone(); resumeB.setWorkExperience("2020-01-01","腾讯"); Resume resumeC = (Resume) resumeA.clone(); resumeC.setPersonalInfo("F","24"); resumeA.display(); resumeB.display(); resumeC.display(); /** * 运行结果 * * name = 杨过,sex = M,age = 29 * 工作经历:2020-04-03-阿里巴巴 * name = 杨过,sex = M,age = 29 * 工作经历:2020-01-01-腾讯 * name = 杨过,sex = F,age = 24 * 工作经历:2020-04-03-阿里巴巴 */ } }
来源:https://www.cnblogs.com/zsmcwp/p/12629907.html