一、概念
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
二、类图
三、实例之简历
潜复制:被复制对象的所有属性都含有与原来的对象相同的值,而所有对象的引用都仍指向原有的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
下面为简历类的浅复制及深复制在原型模式中的应用。
//工作经历类
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();
}
}
//1、深复制
//具体原型类
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience experience;
public Resume(String name) throws Exception{
this.name=name;
//克隆"工作经历"的数据
experience=new WorkExperience();
}
private Resume(WorkExperience experience) throws Exception{
this.experience=(WorkExperience) experience.clone();
}
public void SetPersonInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
public void SetWorkExperience(String workDate,String company){
experience.setWorkDate(workDate);
experience.setCompany(company);
}
public void Display(){
System.out.println("姓名:"+name+" 性别:"+sex+" 年龄:"+age);
System.out.println("工作经历: "+experience.getWorkDate()+experience.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume obj = null;
try {
obj=new Resume(this.experience);
} catch (Exception e) {
e.printStackTrace();
}
obj.name=this.name;
obj.sex=this.sex;
obj.age=this.age;
return obj;
}
}
/*
* 深复制---把引用对象的变量指向复制过的新对象,而不是原有的被应用的对象
*/
//客户端
public class Show {
public static void main(String[] args) throws Exception {
Resume a = new Resume("纳尼");
a.SetPersonInfo("男", "19");
a.SetWorkExperience("2018", "xxx");
Resume b = (Resume) a.clone();
b.SetWorkExperience("2019", "ttt");
Resume c = (Resume) a.clone();
c.SetWorkExperience("2020", "zzz");
a.Display();
b.Display();
c.Display();
/*
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2018xxx
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2019ttt
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2020zzz
*/
}
}
2、浅复制
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience experience;
public Resume(String name){
this.name=name;
experience=new WorkExperience();
}
public void SetPersonalInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
public void setExperience(String workDate,String company) {
experience.setWorkDate(workDate);
experience.setCompany(company);
}
public void Display(){
System.out.println("姓名:"+name+" 性别:"+sex+" 年龄:"+age);
System.out.println("工作经历: "+experience.getWorkDate()+experience.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
/*
* 浅复制---所有对其他对象的引用都仍然指向原来的对象
*/
public class Show {
public static void main(String[] args) throws Exception {
Resume a=new Resume("纳尼");
a.SetPersonalInfo("男", "19");
a.setExperience("2018", "xxx");
Resume b=(Resume) a.clone();
b.setExperience("2019", "xxx");
Resume c=(Resume) a.clone();
c.setExperience("2020", "xxx");
a.Display();
b.Display();
c.Display();
/*
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx*/
}
}
四、总结
在简历类案例中,通过浅复制可得到与(原型类)简历类型一致且工作经历一致的简历实例,通过深复制可以得到与(原型类)简历类型一致但工作经历不同的简历实例。
/*浅复制:
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx*/
/*深复制:
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2018xxx
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2019ttt
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2020zzz
*/
“`
此时再来看原型模式的概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象便有了更清楚的理解。
Fear not that life shall come to an end,but rather fear that it shall never have a beginning.