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發放就可以完成原型模式。
一般在初始化的信息不發生變化的情況下 ,克隆是最好的辦法。這既隱藏了對象創建的細節,又對性能是大大的提高。
不要重新初始化對象,而是動態地獲得對象運行時的狀態。
參考:《大話設計模式》