Specify the kind of object to create using a prototypical instance, and create new objects by copying this prototype。(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象)
原型模式的使用场景
1)资源优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
2)性能和安全要求的场景:通过new一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式。
3)一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可以都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者调用。
原型模式的通用代码如下:
public class PrototypeClass implements Cloneable { //覆写父类Object的方法 @Override public PrototypeClass clone() { PrototypeClass object = null; try { object = (PrototypeClass) super.clone(); } catch (CloneNotSupportedException e){ //异常处理 } return object; } }原型模式的优点
//浅拷贝 public class Thing implements Cloneable { //定义一个私有变量 private ArrayList<String> arrayList = new ArrayList<String>(); @Override public Thing clone() { Thing thing = null; try { thing = (Thing) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } //设置ArrayList的值 public void setValue(String value) { this.arrayList.add(value); } //获得ArrayList的值 public ArrayList<String> getValue() { return this.arrayList; } } //浅拷贝测试 public class Client { public static void main(String[] args) { //产生一个对象 Thing thing = new Thing(); //设置一个值 thing.setValue("张三"); //拷贝一个对象 Thing cloneThing = thing.clone(); cloneThing.setValue("李四"); System.out.println(thing.getValue); } }猜想一下运行结果应该是什么,是仅一个张三吗,运行结果如下所示:
//深拷贝 public class Thing implements Cloneable { //定义一个私有变量 private ArrayList<String> arrayList = new ArrayList<String>(); @Override public Thing clone() { Thing thing = null; try { thing = (Thing) super.clone(); this.arrayList = (ArrayList<String>)this.arrayList.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } //设置ArrayList的值 public void setValue(String value) { this.arrayList.add(value); } //获得ArrayList的值 public ArrayList<String> getValue() { return this.arrayList; } }仅仅增加了一行代码,就可以对私有变量进行独立的拷贝了,clien端没有改变,运行结果是[张三]