一、 定义
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建对象,就是从一个对象再创建另外一个可定制的对象,而且不需要指定任何创建的细节。
拷贝涉及到深拷贝和浅拷贝,浅拷贝指被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深拷贝,把引用对象的变量指向复制过得新对象,而不是原有的被引用对象。
原型模式通常适用于以下场景。
• 对象之间相同或相似,即只是个别的几个属性不同的时候。
• 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
• 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
• 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值
二、 结构图
扩展,带原型管理器,可以通过get(String id)获取相应类型的原型
三、 示例代码(待补充)
package org.example.PrototypeModel;
public class Prototype implements Cloneable {
private String personName="";
private int workyear = 0;
private String workcontent="";
// public Prototype(String personName, int workyear, String workcontent) {
// this.personName = personName;
// this.workyear = workyear;
// this.workcontent = workcontent;
// }
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
// {
// Prototype pt = null;
// try {
// pt = (Prototype) super.clone();
// } catch (CloneNotSupportedException e) {
// e.printStackTrace();
// }
// return pt;
// }
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public int getWorkyear() {
return workyear;
}
public void setWorkyear(int workyear) {
this.workyear = workyear;
}
public String getWorkcontent() {
return workcontent;
}
public void setWorkcontent(String workcontent) {
this.workcontent = workcontent;
}
}
package org.example.PrototypeModel;
public class PrototypeA extends Prototype {
public PrototypeA(String personName,int workyear,String workcontent){
this.setPersonName(personName);
this.setWorkyear(workyear);
this.setWorkcontent(workcontent);
//super(personName,workyear,workcontent);
}
public void show(){
System.out.println("*********jianli*************");
System.out.println("name:" + this.getPersonName());
System.out.println("workyear:" + this.getWorkyear());
System.out.println("workcontent:" + this.getWorkcontent());
}
@Override
public PrototypeA clone() {
PrototypeA pt = null;
try {
pt = (PrototypeA) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return pt;
}
}
package org.example.PrototypeModel;
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
PrototypeA pt = new PrototypeA("jhone",3,"lkoojj");
PrototypeA pta = pt.clone();
pta.setPersonName("lily");
pta.setWorkyear(4);
pta.setWorkcontent("lskfjkkdfljd");
pta.show();
pt.show();
}
}