原型模式,在笔者理解看来就是克隆,当我们在创建第一个对象时,已经给对象赋值完毕,此时我们需要一个当前对象的副本,如果没有原型模式,我们会再次创建一个对象,然后后二次赋值,保证两个对象完全一致,
这样我们的代码可读性就比较差,而且稍不留神copy错了麻烦就大了了,此时我们如果了解原型模式,就能够美化我们的代码,看起来够整洁,而且也不会出错。
原型模式 | 说明 |
---|---|
浅克隆 | 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址 |
深度克隆 | 深复制把要复制的对象所引用的对象都复制了一遍 |
浅复制
/**
* 简历对象
*/
public class Resume implements Cloneable{
private String name;
private String age;
private String company;
public Resume() {
}
public Resume(String name, String age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = (Resume) super.clone();
return resume;
}
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;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
/**
* 客户端
*/
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("小菜", "25");
resume.setCompany("XXX-公司");
Resume resume1 = (Resume) resume.clone();
resume1.setCompany("AAA-公司");
System.out.println(resume.getName());
System.out.println(resume.getCompany());
System.out.println(resume1.getName());
System.out.println(resume1.getCompany());
}
}
小菜
XXX-公司
小菜
AAA-公司
深复制
/**
* 简历对象
*/
public class Resume implements Cloneable{
private String name;
private String age;
private WorkExperience workExperience;
public Resume() {
workExperience = new WorkExperience();
}
public Resume(String name, String age) {
this.name = name;
this.age = age;
workExperience = new WorkExperience();
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = (Resume) super.clone();
resume.setWorkExperience((WorkExperience) this.workExperience.clone());
return resume;
}
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;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
}
/**
* 客户端
*/
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("小菜", "25");
resume.getWorkExperience().setCompany("XXX-公司");
Resume resume1 = (Resume) resume.clone();
resume1.getWorkExperience().setCompany("AAA-公司");
System.out.println(resume.getName());
System.out.println(resume.getWorkExperience().getCompany());
System.out.println(resume1.getName());
System.out.println(resume1.getWorkExperience().getCompany());
}
}
小菜
XXX-公司
小菜
AAA-公司