《大话设计模式》第九章
package ch09;
public class WorkExperience implements Cloneable {
private String workDate = null;
private String company = null;
public String getWorkDate() {
return workDate;
}
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
protected Object clone() throws CloneNotSupportedException {
WorkExperience workExperience = (WorkExperience)super.clone();
workExperience.company = new String(this.company);
workExperience.workDate = new String(this.workDate);
return workExperience;
}
}
package ch09;
public class Resume implements Cloneable {
private String name = null;
private String sex = null;
private int age = 0;
private WorkExperience workExperience = null;
public Resume(String name) {
this.name = name;
this.workExperience = new WorkExperience();
}
public Resume(WorkExperience workExperience) throws CloneNotSupportedException {
this.workExperience = (WorkExperience)workExperience.clone();
}
public void setPersonalInfo(String sex, int age) {
this.age = age;
this.sex = sex;
}
public void setWorkExperience(String workDate, String company) {
this.workExperience.setWorkDate(workDate);
this.workExperience.setCompany(company);
}
public void display() {
System.out.println(name + ", " + sex + ", " + age);
System.out.println(workExperience.getWorkDate() + ", " + workExperience.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = new Resume(this.workExperience);
resume.age = this.age;
resume.name = this.name;
resume.sex = this.sex;
return resume;
}
}
package ch09;
import java.text.SimpleDateFormat;
public class Client {
SimpleDateFormat sdf = new SimpleDateFormat();
/**
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
Resume a = new Resume("大鸟");
a.setPersonalInfo("男", 29);
a.setWorkExperience("1998-2000", "X公司");
Resume b = (Resume)a.clone();
b.setWorkExperience("1998-2006", "Y公司");
Resume c = (Resume)a.clone();
c.setWorkExperience("1998-2003", "Z公司");
a.display();
b.display();
c.display();
}
}
原型模式,从字面意思来理解,不是很好理解,反正对我来说是这样的。原型模式其实就是克隆,必须实现Cloneable接口,然后要重写protected Object clone() throws CloneNotSupportedException这个方法。clone还分为浅复制和深复制。我的代码里的是深复制。