原型模式:原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
本文的例子依旧是大鸟和小菜的例子,只是把书上的c++版本换成了Java版
创建一个工作类:
package 设计模式.原型模式;
//这个是工作类
public class Work implements Cloneable{
// 定义两个私有变量
private String workDate;
private String company;
// 为这两个变量添加set和get方法
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;
}
// 重写clone方法,注意需要处理异常
public Work clone(){
try {
return (Work) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
创建求职简历类
package 设计模式.原型模式;
//这个是简历类
public class Resume implements Cloneable{
// 定义几个私有变量
private String name;
private String age;
private String sex;
// 为工作类创建一个对象,这个private可加可不加
private Work w = new Work();
// 书写一个构造方法
public Resume(String name) {
this.name = name;
}
// 定义一个方法填充对象的年龄和性别
public void setPersonInfo(String age,String sex){
this.age = age;
this.sex = sex;
}
// 这个方法是用来更改对象的工作经历的,包括workDate和company
public void setWork(String workDate,String company){
w.setWorkDate(workDate);
w.setCompany(company);
}
// 继续重写clone方法
protected Resume clone() {
Resume resume = new Resume(name);
resume.sex = this.sex;
resume.age = this.age;
resume.w = w.clone();
return resume;
}
// 这个方法是用来展示的,把想输出的格式给展示出来
public void display(){
System.out.println("姓名:" + name + " "+age);
System.out.println("工作经历"+w.getWorkDate()+",公司:"+w.getCompany());
}
}
最后创建一个测试主类
package 设计模式.原型模式;
//测试主类
public class Test {
public static void main(String[] args) {
// 创建一个对象,为该对象填充一个名字
Resume a = new Resume("香风智乃");
// 为该对象填充基本信息
a.setPersonInfo("18","女");
a.setWork("2015-2021","bilibili有限公司");
// 创建一个新的对象,这个对象用来复制a对象的信息,但有不满意的地方,可以进行修改
Resume b = a.clone();
b.setWork("1998-2021","小破站");
// c对象也是同理
Resume c = a.clone();
c.setWork("2010-2019","呀嘞呀嘞daze有限公司");
// 把这三个对象的信息展示出来
a.display();
b.display();
c.display();
}
}
附上运行结果:
以上就是原型模式
最后,附上参考的大佬的文章:
https://blog.csdn.net/monkey_d_meng/article/details/5695479