1、原型模式的规范定义:
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的实例。
2、原型模式的实质:
利用一个指定的对象实例,再创建一个同类型的对象实例,且这个新对象可以被定制,而且不需要知道创建的细节。
3、在java中的实现方式:
一个类只要实现了Cloneable()接口,就能作为原型被复制。当创建一个同类型的新实例时,可以通过调用这个类的clone()方法,实现新对象的创建及拷贝。
4、优势:
4.1、每次创建新对象时,不需要通过new来创建,节省了该类的构造方法执行时间,从而提升性能。
4.2、隐藏了实例的创建细节。
5、适用场景:
一般在初始化信息不发生改变的情况下,克隆是最好的方法。
6、UML图:
注意:在java中,Prototype这个抽象类是用不到的,因为java自己有Cloneable接口。任何实现了Cloneable接口的并在类中复写了public类型clone()方法的类,在调用clone()方法时,都会实现浅拷贝。如果一个类没有实现Cloneable接口,在调用clone()方法时,会报错。这一点可以查看Cloneable接口的说明。
7、模拟例子:
7.1、UML图
7.2、code:
依次为:Client,Resume,WorkExperience
package designmodel.ninthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 11:49
* @ProjectName: JavaBaseTest
*/
public class Client {
public static void main(String[] args) {
Resume resume1=new Resume("李沁");
resume1.setSelfInfo("女",22);
resume1.setWorkExperience("北京",11,"技术研发");
resume1.print();
//原型模式的使用:根据指定对象resume1创建同类型的新对象resume2,且对对象的创建做定制,定制通过两个set方法完成.
Resume resume2=(Resume)resume1.clone();
resume2.setSelfInfo("女",25);
resume2.setWorkExperience("天津",9,"技术支持");
resume2.print();
//clone()方法对引用的拷贝是浅拷贝
resume1.print();
}
}
package designmodel.ninthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 11:49
* @ProjectName: JavaBaseTest
*/
public class Resume implements Cloneable{
private String name;
private String sex;
private int age;
private WorkExperience experience;
Resume(String name){
this.name=name;
experience=new WorkExperience();
}
@Override
public Object clone() {
return this;
}
//设置个人信息
public void setSelfInfo(String sex,int age){
this.sex=sex;
this.age=age;
}
//设置工作经历
public void setWorkExperience(String location,int time,String job){
experience.setWorkSpace(location);
experience.setStayTime(time);
experience.setJob(job);
}
//打印简历信息
public void print(){
System.out.println("name:"+name);
System.out.println("sex:"+sex);
System.out.println("age:"+age);
System.out.println("workSpace: 工作地点:"+experience.getWorkSpace()+",工作时长(年):"+experience.getStayTime()+",岗位:"+experience.getJob());
}
}
package designmodel.ninthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 11:50
* @ProjectName: JavaBaseTest
*/
public class WorkExperience {
private String workPlace;
private int stayTime;
private String job;
public void setWorkSpace(String workSpace) {
this.workPlace = workSpace;
}
public void setStayTime(int stayTime) {
this.stayTime = stayTime;
}
public void setJob(String job) {
this.job = job;
}
public String getWorkSpace() {
return workPlace;
}
public int getStayTime() {
return stayTime;
}
public String getJob() {
return job;
}
}