1、定义
(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2、使用场景
简历的复印,拷贝所有简历上的内容,复印到其他A4纸上。
3、代码结构UML图
简历:具体原型类,实现一个克隆自身的操作;
工作经历:一个普通的类,为了实现深复制,实现ICloneable接口。
4、类的实现
(1)、Resume(简历类)
public class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name) {
this.name = name;
work = new WorkExperience();
}
private Resume(WorkExperience work) throws CloneNotSupportedException {
this.work = (WorkExperience) work.clone();//深复制
// this.work = work;//浅复制
}
public void setPersonInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workDate, String company) {
this.work.setWorkDate(workDate);
this.work.setCompany(company);
}
public void display() {
System.out.println(name + " " + sex + " " + age);
System.out.println(work.getWorkDate() + " " + work.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = new Resume(this.work);
resume.name = this.name;
resume.sex = this.sex;
resume.age = this.age;
return resume;
}
}
(2)、WorkExperience (工作经历类)
public class WorkExperience implements Cloneable{
private String workDate;
private String company;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getWorkDate() {
return workDate;
}
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
5、客户端调用
public static void main(String[] args) {
Resume a = new Resume("小明");
a.setPersonInfo("男","29");
a.setWorkExperience("1998-2000","XX公司");
Resume b = null;
try {
b = (Resume) a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
b.setWorkExperience("1998-2006","YY公司");
Resume c= null;
try {
c = (Resume) a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
c.setWorkExperience("1998-2003","ZZ企业");
a.display();
b.display();
c.display();
}
输出:
6、总结
实现深复制时需要在对应类的引用对象实现clone方法;
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。使用场景多。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
集成ICloneable接口,实现clone发放就可以完成原型模式。
一般在初始化的信息不发生变化的情况下 ,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
不要重新初始化对象,而是动态地获得对象运行时的状态。
参考:《大话设计模式》
James-Tom 发布了42 篇原创文章 · 获赞 6 · 访问量 5万+ 私信 关注