前言:
原型模式(Prototype Pattern)是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
一.原型模式简介:
原型模式就是通过一个对象来创建对象,隐藏了创建细节。
模型模式主要应用的是对象的深复制,即对象的克隆。如果不了解,请先学习深复制和浅复制,点击查看。
二.原型模式的实现:
案例:招聘网站的简历中心可以通过一份简历创建另一份简历,新简历会自动填入个人基本信息。
1.UML模型图:
2.模型类(简历类):
此类为一个标准的JavaBean类,只不过在此基础上实现了Cloneable接口,并实现clone()方法,用来深复制简历。
package com.pattern.prototype;
//简历类(模型类)
public class Resume implements Cloneable {
private String name;
private String age;
private String sex;
private String company;
private String workTime;
public Resume(String name) {
super();
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getWorkTime() {
return workTime;
}
public void setWorkTime(String workTime) {
this.workTime = workTime;
}
//设置个人信息
public void setPersonalInfo(String age, String sex) {
this.age = age;
this.sex = sex;
}
//设置工作经验
public void setWorkExperence(String workTime, String company) {
this.workTime = workTime;
this.company = company;
}
//简历预览
public void show() {
System.out.println("姓名:"+name+",性别:"+sex+",年龄:+age+",工龄:"+workTime+",所在公司:"+company);
}
// 实现克隆方法,用于对象克隆
@Override
public Object clone() throws CloneNotSupportedException {
Resume resume = null;
try {
resume = (Resume) super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return resume;
}
}
3.客户端类:
在客户端中,通过firstResume创建出secondResume、thirdResume这两个对象,而不是通过new,减少了通过new创建对象时,初始化构造函数时间消耗,提高效率。
模型模式还隐藏了对象创建的具体细节,提高性能。
package com.pattern.prototype.client;
import com.pattern.prototype.Resume;
public class Client {
public static void main(String[] args) {
try {
Resume firstResume = new Resume("程猿");
firstResume.setPersonalInfo("25", "男");
firstResume.setWorkExperence("2014-2017", "特斯拉");
Resume secondResume = (Resume) firstResume.clone();
Resume thirdResume = (Resume) firstResume.clone();
thirdResume.setWorkExperence("2014-2018", "皮克斯");
firstResume.show();
secondResume.show();
thirdResume.show();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
运行结果:
姓名:程猿,性别:男,年龄:25,工龄:2014-2017,所在公司:特斯拉
姓名:程猿,性别:男,年龄:25,工龄:2014-2017,所在公司:特斯拉
姓名:程猿,性别:男,年龄:25,工龄:2014-2018,所在公司:皮克斯
通过结果可以看出,我们修改了thirdResume对象(第三份简历),但不会对其他简历(对象firstResume和secondResume)造成影响。通过第一份填写好的简历模板,快速创建多份简历,各个简历之间互不影响,这就是原型模式的常用的应用。
原型模式也经常应用在对数据集的克隆和定制,如新闻客户端导航栏目的定制等。
总结:
- 模板模式主要利用了克隆对象(深复制)的方式创建对象,既隐藏创建对象的过程,又节省了资源消耗。
- 模板模式不用重新初始化对象,而是动态的获得对象运行时的状态。