原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
浅复制
Resume 实现Cloneable接口,并且重写clone方法
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume(String name){
this.name=name;
}
public void setPersonalInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
public void setWorkExperience(String timeArea,String company){
this.timeArea=timeArea;
this.company=company;
}
public void display(){
System.out.println("name:"+name+" sex:"+sex+" age:"+age);
System.out.println("工作经历:"+timeArea+" "+company);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Test.java
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("张三");
resume.setPersonalInfo("男", "24");
resume.setWorkExperience("2005-2009", "XX公司");
Resume b=(Resume)resume.clone();
b.setWorkExperience("2009-2010", "YY公司");
resume.display();
b.display();
}
}
深复制
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原来的被引用的对象。
WorkExperience.java
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
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Resume.java
public class Resume implements Cloneable{
private String name;
private String age;
private String sex;
private WorkExperience workExperience;
public Resume(String name){
this.name=name;
workExperience=new WorkExperience();
}
private 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:"+name+" sex:"+sex+" age:"+age);
System.out.println("工作经历:"+workExperience.getWorkDate()+" "+workExperience.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
//对象的深复制
Resume resume = new Resume(this.workExperience);
resume.name=this.name;
resume.sex=this.sex;
resume.age=this.age;
return resume;
}
}
Test.java
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("张三");
resume.setPersonalInfo("男", "24");
resume.setWorkExperience("2011-2014", "YY公司");
//b指向的workExperience是新的引用,而非旧的引用
Resume b = (Resume)resume.clone();
b.setWorkExperience("2013-2015", "KK公司");
resume.display();
b.display();
}
}