原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
public class WorkExperience {
private String workDate;
private String company;
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;
}
}
public class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience workExperience;
public Resume(String name) {
this.name = name;
workExperience = new WorkExperience();
}
public void setPersonalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workDate, String company) {
workExperience.setWorkDate(workDate);
workExperience.setCompany(company);
}
public void display() {
System.out.println("姓名:" + name + ",性别:" + sex + ",年龄:" + age);
System.out.println("工作经历:" + workExperience.getWorkDate() + "," + workExperience.getCompany());
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("<-- 浅拷贝 -->");
Resume r0 = new Resume("大鸟");
r0.setPersonalInfo("男", "29");
r0.setWorkExperience("1998-2000", "xx公司");
Resume r1 = (Resume) r0.clone();
r1.setWorkExperience("1998-2006", "yy企业");
Resume r2 = (Resume) r0.clone();
r2.setPersonalInfo("女", "18");
r2.setWorkExperience("1998-2003", "zz企业");
r0.display();
r1.display();
r2.display();
}
}
public class WorkExperience implements Cloneable {
private String workDate;
private String company;
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
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience workExperience;
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, String age) {
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workDate, String company) {
workExperience.setWorkDate(workDate);
workExperience.setCompany(company);
}
public void display() {
System.out.println("姓名:" + name + ",性别:" + sex + ",年龄:" + age);
System.out.println("工作经历:" + workExperience.getWorkDate() + "," + workExperience.getCompany());
}
@Override
public Object clone() throws CloneNotSupportedException {
Resume resume = new Resume(this.workExperience);
resume.name = this.name;
resume.sex = this.sex;
resume.age = this.age;
return resume;
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("<-- 深拷贝 -->");
Resume r0 = new Resume("大鸟");
r0.setPersonalInfo("男", "29");
r0.setWorkExperience("1998-2000", "xx公司");
Resume r1 = (Resume) r0.clone();
r1.setWorkExperience("1998-2006", "yy企业");
Resume r2 = (Resume) r0.clone();
r2.setPersonalInfo("女", "18");
r2.setWorkExperience("1998-2003", "zz企业");
r0.display();
r1.display();
r2.display();
}
}
public class WorkExperience implements Serializable {
private static final long serialVersionUID = 1L;
private String workDate;
private String workCompany;
public String getWorkDate() {
return workDate;
}
public WorkExperience setWorkDate(String workDate) {
this.workDate = workDate;
return this;
}
public String getWorkCompany() {
return workCompany;
}
public WorkExperience setWorkCompany(String workCompany) {
this.workCompany = workCompany;
return this;
}
}
public class Resume implements Cloneable, Serializable {
private static final long serialVersionUID = -4410449301166191440L;
private String name;
private String gender;
private int age;
private WorkExperience workExperience;
public Resume() {
workExperience = new WorkExperience();
}
public void display() {
System.out.println(this.getName() + " " + this.getGender() + " "
+ this.getAge() + "\n工作经历: "
+ this.getWorkExperience().getWorkDate() + " "
+ this.getWorkExperience().getWorkCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
bos.toByteArray()));
return ois.readObject();
}
public String getName() {
return name;
}
public Resume setName(String name) {
this.name = name;
return this;
}
public String getGender() {
return gender;
}
public Resume setGender(String gender) {
this.gender = gender;
return this;
}
public int getAge() {
return age;
}
public Resume setAge(int age) {
this.age = age;
return this;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(String workDate, String workCompany) {
workExperience.setWorkDate(workDate);
workExperience.setWorkCompany(workCompany);
}
}
public class PrototypeClient {
public static void shallowCopy() throws CloneNotSupportedException {
Resume aResume = new Resume();
aResume.setName("大鸟 ").setGender("男 ").setAge(25);
aResume.setWorkExperience("1999-2002, ", "XX公司");
Resume bResume = (Resume) aResume.clone();
bResume.setWorkExperience("1999-2002, ", "YY公司");
Resume cResume = (Resume) aResume.clone();
cResume.setWorkExperience("1999-2002, ", "ZZ公司");
System.out.println(">>>>>>浅度拷贝:");
aResume.display();
bResume.display();
cResume.display();
}
public static void deepCopy() throws CloneNotSupportedException,
ClassNotFoundException, IOException {
Resume aResume = new Resume();
aResume.setName("大鸟 ").setGender("男 ").setAge(25);
aResume.setWorkExperience("1999-2002, ", "XX公司");
Resume bResume = (Resume) aResume.deepClone();
bResume.setWorkExperience("1999-2002, ", "YY公司");
Resume cResume = (Resume) aResume.deepClone();
cResume.setWorkExperience("1999-2002, ", "ZZ公司");
System.out.println(">>>>>>深度拷贝:");
aResume.display();
bResume.display();
cResume.display();
}
public static void main(String[] args) throws CloneNotSupportedException,
ClassNotFoundException, IOException {
shallowCopy();
System.out.println("==================================");
deepCopy();
}
}