设计模式之原型模式

时间:2022-08-24 22:21:34

前言:

原型模式(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)造成影响。通过第一份填写好的简历模板,快速创建多份简历,各个简历之间互不影响,这就是原型模式的常用的应用。

原型模式也经常应用在对数据集的克隆和定制,如新闻客户端导航栏目的定制等。

总结:

  1. 模板模式主要利用了克隆对象(深复制)的方式创建对象,既隐藏创建对象的过程,又节省了资源消耗。
  2. 模板模式不用重新初始化对象,而是动态的获得对象运行时的状态。