下面来说说Prototype模式。首先还是照旧先来看看牛人想出Prototype模式的意图。
用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。(G4)
场景
我们手头上已经得到一个Product实例了,现在我们由于业务的要求,需要再获取若干个完全一样或相近的Product,好完成其他的工作。这个时候我们要做的工作就是复制一个。按照以往的做法,我们是每要求复制出一个的时候,我们会先new出一个对象,然后逐个属性地先从样板Product中get出来再set到新对象中去。
- public class ClassSample {
- private String attrA = null;
- private String attrB = null;
- ......
- // setter and getter
- }
- // cs1为得到的样本
- ClassSample cs2 = new ClassSample();
- cs2.setAttrA( cs1.getAttrA() );
- cs2.setAttrB( cs1.getAttrB() );
- ......
程序员总是为如何能够更懒惰而勤奋地努力着。这样的劳模可不是好的程序员该做的事,这种烦琐而重复性高的复制能不能只写一遍呢?答案是“可以”,而且很简单。我们只需要在原型对象中增加一个clone()函数即可,由类本身来帮我们完成这个复制工作。
- public class ClassSample {
- private String attrA = null;
- private String attrB = null;
- ......
- // settter and getter
- // clone
- public ClassSample clone() {
- ClassSample cs = new ClassSample();
- cs.setAttrA(this.attrA);
- cs.setAttrB(this.attrB);
- return cs;
- }
- }
这样,复制创建对象就简单了很多了。
- ClassSample cs2 = cs1.clone();
本来故事到这里便结束了。可是由于Java为我们做了更多,让我们更方便地使用Prototype模式,为了让懒惰进行到底,也同时体谅一下Java的良苦用心,有义务要在这里说说Java为我们做的Prototype模式的简化。大家都知道在Java中所有的类都是java.lang.Object的子类,而且在Object中已经定义了clone()方法。通过使用这个clone()方法我们就可以简单方便地进行复制创建了。
可是这个clone()方法可不能随便使用,冒失失地调用surper.clone()是会抛出CloneNotSupportedException异常的。我们还需要实现Cloneable接口才行。
- public class ClassSample implements Cloneable {
- private String attrA = null;
- private String attrB = null;
- ......
- // settter and getter
- // clone
- public ClassSample clone() throws CloneNotSupportedException {
- ClassSample cs = (ClassSample) super.clone();
- return cs;
- }
- }
简单的一句super.clone()就可以完成我们的各种setter,getter操作。确实很方便。
我们在进行clone的时候仍然使用下面的句子就可以进行对象复制创建了。
- ClassSample cs2 = cs1.clone();