大话设计模式笔记(六)——原型模式
- 2019 年 10 月 30 日
- 笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/76549439
第九章原型模式
在面向对象语言中,解决复制对象而不是复制引用的问题的解决方法是原型模式。
原型模式的UML图

Java中,原型接口是存在的,是Copyable。Clone方法是Object的clone(),不过是protected,使用super.clone()时,必须实现Copyable接口。不然会抛出CloneNotSupportedException异常。
例子,原型模式实现深复制:
现有简历类,简历中有工作经历类,通过原型模式实现简历类的复制。
UML图

简历类
public class Resume implements Cloneable{ private int id; private String name; private int age; private String sex; private WorkExperience workExperience; public Resume(Stringname) { this.name = name; workExperience = new WorkExperience(); } /** getter、setter */ public void setWorkExperience(StringcomanyName, double workTime) { this.workExperience.setCompanyName(comanyName); this.workExperience.setWorkTime(workTime); } public Objectclone() { try { Resume user = (Resume) super.clone(); user.workExperience= (WorkExperience) workExperience.clone(); return user; } catch(CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
工作经验类
public class WorkExperience implements Cloneable{ private StringcompanyName; private double workTime; /** getter、setter */ public Objectclone() { try { return (WorkExperience)super.clone(); } catch(CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
client类
public class Client { public static void main(String[]args) { Resume zhangsan = new Resume("张三"); zhangsan.setId(1); zhangsan.setAge(19); zhangsan.setWorkExperience("XXXX有限公司", 4); Resume lisi = (Resume) zhangsan.clone(); lisi.setName("李四"); lisi.setWorkExperience("腾讯", 1); System.out.println(zhangsan.getName() + "," + zhangsan.getAge() + "," + zhangsan.getWorkExperience().getCompanyName() + "/0" + zhangsan.getWorkExperience().getWorkTime()); System.out.println(lisi.getName() + "," + lisi.getAge() + "," + lisi.getWorkExperience().getCompanyName() + "/0" + lisi.getWorkExperience().getWorkTime()); } }
总结
原型模式是的作用是用来复制对象的。原型模式赋值时不考虑构造细节,所以它比构造效率高。
原始模式的复制涉及深复制和浅复制。浅复制是只复制对象中的基本数据类型,而引用类型只复制引用,实际指向同一个对象。深复制是复制对象中的所有属性。