版权声明:本文为博主原创文章,遵循 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());
}
}
原型模式是的作用是用来复制对象的。原型模式赋值时不考虑构造细节,所以它比构造效率高。
原始模式的复制涉及深复制和浅复制。浅复制是只复制对象中的基本数据类型,而引用类型只复制引用,实际指向同一个对象。深复制是复制对象中的所有属性。