原型模式:
一个对象提供方法复制本身对象,从而生成新的对象。
浅拷贝和深拷贝:
说到原型模式,就不得不说浅拷贝和深拷贝。在对象进行复制时,同时会将源对象中的元素复制到新的对象中,其中元素分为值类型和引用类型。
浅拷贝和深拷贝的共同点在于都将值类型的元素复制到新对象中;区别点在于浅拷贝只是将复制了源对象中元素的地址,也就说新对象中的引用类元素和源对象的元素指的是同一个对象。而深拷贝是将引用类的元素重新在创建一个对象,新对象和源对象的引用类元素是不同的对象。
浅拷贝代码实现:
public class Resume implements Cloneable{
private String name;
private String sex;
private int age;
private WorkExperience workExperience;
public Resume(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Resume{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", workExperience=" + workExperience.toString() +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class WorkExperience {
private Date workStartTime;
private Date workEndTime;
private String company;
public WorkExperience(Date workStartTime, Date workEndTime, String company) {
this.workStartTime = workStartTime;
this.workEndTime = workEndTime;
this.company = company;
}
public Date getWorkStartTime() {
return workStartTime;
}
public void setWorkStartTime(Date workStartTime) {
this.workStartTime = workStartTime;
}
public Date getWorkEndTime() {
return workEndTime;
}
public void setWorkEndTime(Date workEndTime) {
this.workEndTime = workEndTime;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return "WorkExperience{" +
"workStartTime=" + workStartTime +
", workEndTime=" + workEndTime +
", company='" + company + '\'' +
'}';
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("jack", "mule", 20);
WorkExperience workExperience = new WorkExperience(new Date(), new Date(), "IBM");
resume.setWorkExperience(workExperience);
Resume clone = (Resume) resume.clone();
System.out.println(clone.toString());
System.out.println(resume == clone);
System.out.println(resume.getWorkExperience() == clone.getWorkExperience());
resume.getWorkExperience().setCompany("Google");
System.out.println(clone.getWorkExperience().getCompany());
}
}
深拷贝代码实现:
public class Resume implements Cloneable{
private String name;
private String sex;
private int age;
private WorkExperience workExperience;
public Resume(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Resume{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", workExperience=" + workExperience.toString() +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume cloneResume = (Resume) super.clone();
cloneResume.workExperience = (WorkExperience) this.workExperience.clone();
return cloneResume;
}
}
public class WorkExperience implements Cloneable{
private Date workStartTime;
private Date workEndTime;
private String company;
public WorkExperience(Date workStartTime, Date workEndTime, String company) {
this.workStartTime = workStartTime;
this.workEndTime = workEndTime;
this.company = company;
}
public Date getWorkStartTime() {
return workStartTime;
}
public void setWorkStartTime(Date workStartTime) {
this.workStartTime = workStartTime;
}
public Date getWorkEndTime() {
return workEndTime;
}
public void setWorkEndTime(Date workEndTime) {
this.workEndTime = workEndTime;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return "WorkExperience{" +
"workStartTime=" + workStartTime +
", workEndTime=" + workEndTime +
", company='" + company + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("jack", "mule", 20);
WorkExperience workExperience = new WorkExperience(new Date(), new Date(), "IBM");
resume.setWorkExperience(workExperience);
Resume clone = (Resume) resume.clone();
System.out.println(clone.toString());
System.out.println(resume == clone);
System.out.println(resume.getWorkExperience() == clone.getWorkExperience());
resume.getWorkExperience().setCompany("Google");
System.out.println(clone.getWorkExperience().getCompany());
}
}