原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
/**
* 原型模式
* 关键:
* (java):实现Cloneable 接口,并重写Clone方法
* 浅复制:复制对象,把对象中的数值类型进行复制,复制引用但不复制引用的对象
* 深复制:复制对像,把对象中的数值类型进行复制,并且复制引用的对象(需要自己重写clone方法,例子如下)
* @author zbl
*
*/
//深复制
public class PrototypeCustomer {
public static void main(String[] args) throws CloneNotSupportedException {
WorkExperience experience = new WorkExperience();
Resume r1 = new Resume("12","yy",experience);
r1.setWorkExperience("2018", "XIXI");
Resume r2 = (Resume) r1.clone();
r2.setWorkExperience("2017", "haha");
System.out.println(r1.toString());
System.out.println(r2.toString());
}
}
class Resume implements Cloneable{
private String name;
private String age;
private WorkExperience workExperience;
public Resume(WorkExperience workExperience) throws CloneNotSupportedException {
this.workExperience = (WorkExperience) workExperience.clone();
}
public Resume(String name, String age,WorkExperience workExperience) throws CloneNotSupportedException {
this.name = name;
this.age = age;
this.workExperience = workExperience;
}
public void setWorkExperience(String workDate, String company) {
workExperience.setWorkDate(workDate);
workExperience.setCompany(company);
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume obj = new Resume(this.workExperience);
obj.setAge(this.age);
obj.setName(this.name);
return obj;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Resume [name=" + name + ", age=" + age + ", workExperience=" + workExperience.getWorkDate() + "||"+workExperience.getCompany()+"]";
}
}
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
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}