一、定义
原型模式用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
在Java中需实现Cloneable接口,实现这个接口就可以完成原型模式了。
需要注意clone方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象,因此原始对象及其复本引用同一对象,也就是不会被克隆过来。
二、UML类图
三、实现
- 原型类
package com.jthao.design.des.prototype;
import java.util.ArrayList;
import java.util.List;
public class Resume implements Cloneable {
private String name;
private List<String> list;
private PersonalInfo personalInfo;
public Resume clone() throws CloneNotSupportedException {
Resume resume = (Resume) super.clone();
List<String> newList = new ArrayList<String>();
if (this.list != null) {
for (String str : this.list) {
newList.add(str);
}
resume.setList(newList);
}
if (personalInfo != null) {
this.personalInfo = (PersonalInfo) personalInfo.clone();
resume.setPersonalInfo(personalInfo);
}
return resume;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public PersonalInfo getPersonalInfo() {
return personalInfo;
}
public void setPersonalInfo(PersonalInfo personalInfo) {
this.personalInfo = personalInfo;
}
}
- 原型引用类
package com.jthao.design.des.prototype;
public class PersonalInfo implements Cloneable {
private String age;
private String sex;
public PersonalInfo clone() {
try {
return (PersonalInfo) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
- 测试类
package com.jthao.design.des.prototype;
public class prototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume();
resume.setName("对象");
PersonalInfo personalInfo = new PersonalInfo();
personalInfo.setAge("18");
personalInfo.setSex("女");
resume.setPersonalInfo(personalInfo);
Resume resume2 = resume.clone();
System.out.println(resume2.getName());
System.out.println(resume2.getPersonalInfo().getAge());
}
}