一、定義
原型模式用原型實例制定創建對象的種類,並且通過拷貝這些原型創建新的對象。其實就是從一個對象再創建另外一個可定製的對象,而且不需要知道任何創建的細節。
在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());
}
}