一、简历代码初步实现
public class Resume {
private String name;
private String sex;
private String age;
private String company;
private String timeArea;
// 实例化简历对象
public Resume(String name) {
this.name = name;
}
// 设置个人信息
public void setPersonInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
// 设置工作经历
public void setWorkExperience(String company, String timeArea) {
this.company = company;
this.timeArea = timeArea;
}
// 展示
public void show(){
System.out.println("个人信息:" + name + " " + sex + " " + age);
System.out.println("工作经历:" + company + " " + timeArea);
}
}
public class RunMain {
public static void main(String[] args){
Resume prototype = new Resume("笨鸟");
prototype.setPersonInfo("男", "28");
prototype.setWorkExperience("亚信科技(中国)有限公司", "2018-2019");
prototype.show();
// 通过实例化复制简历
Resume res = new Resume("笨鸟");
res.setPersonInfo("男", "28");
res.setWorkExperience("亚信科技(中国)有限公司", "2018-2019");
res.show();
}
}
二、简历的原型实现第一版
public class Resume implements Cloneable {
// 同上省略 ... ...
// 创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
// 如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象。
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 子类本身没有clone方法,是从父类object继承的
}
}
public class RunMain {
public static void main(String[] args){
// 同上省略 ... ...
// 通过原型模式浅复制简历(值类型)
// 一般在初始化的信息不发生变化的情况下,克隆是最好的方法。这既隐藏了对象创建的细节,又大大提高了性能。
try {
Resume clone = (Resume) prototype.clone();
clone.show();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
三、简历的原型实现第二版
// 工作经历类
public class WorkExperience implements Cloneable {
String company;
String timeArea;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getTimeArea() {
return timeArea;
}
public void setTimeArea(String timeArea) {
this.timeArea = timeArea;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "WorkExperience [company=" + company + ", timeArea=" + timeArea + "]";
}
}
// 简历类
public class Resume implements Cloneable {
private String name;
private String sex;
private String age;
// 引用工作经历对象
private WorkExperience workExperience;
// 再实例化简历对象同时工作经历对象
public Resume(String name) {
this.name = name;
this.workExperience = new WorkExperience();
}
// 提供Clone方法调用的私有构造函数,以便克隆“工作经历”的数据
public Resume(WorkExperience workExperience) throws CloneNotSupportedException {
this.workExperience = (WorkExperience) workExperience.clone();
}
// 设置个人信息
public void setPersonInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
// 调用此方法给工作经历对象的属性赋值
public void setWorkExperience(String company, String timeArea) {
workExperience.company = company;
workExperience.timeArea = timeArea;
}
// 展示
public void show(){
System.out.println("个人信息:" + name + " " + sex + " " + age);
System.out.println("工作经历:" + workExperience);
}
// 调用私有的构造方法,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值,最终返回一个深复制的简历对象
@Override
public Object clone() throws CloneNotSupportedException {
Resume obj = new Resume(this.workExperience);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}
// 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。从一个对象再创建另外一个可定制的对象,并且不需要知道任何创建的细节。
public class RunMain {
public static void main(String[] args){
// 同上省略 ... ...
// 通过原型模式深复制简历(引用类型)
try {
Resume clone = (Resume) prototype.clone();
clone.setWorkExperience("亚信科技(中国)有限公司", "2019-2020");
clone.show();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}