原型模式prototype
原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
原型模式的优点
性能优良
原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好的体现其优点。
逃避构造函数的约束
这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的(见"原型模式的注意事项"),优点就是减少了约束,缺点也是减少了约束,双刃剑,需要大家在实际应用时考虑。原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的 实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再 去通过new来创建。
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
如何使用?
因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.
前面的几种模式中,我们使用了不同的构造方法(各种Factory或者Builder)去代替或者说掩盖Java语言之中“new”这个操作来创建对象实例。Java中要创建一个新的对象并不一定只能靠“new”这个关键字的,我们还有“clone()”。
在接触原型模式之前,我们先来了解一下克隆一些知识:
1.clone()方法在Java中从Object类开始就具备,并且作为原生(Native)方法出现。它默认是protected的,因此在被子类提升可见性之前,无法被外界使用。
2.所有需要进行克隆操作的类都必须实现Cloneable接口,这个接口与Serializable接口一样,没有任何需要实现的方法,仅仅是作为一个标示。
3.所有数组都实现了Cloneable接口,并且已经提升了clone()方法的可见性至public,换句话说数组对象是可以直接调用clone()方法的。
4.克隆分为浅拷贝和深拷贝两种,浅拷贝的操作基本上可以理解为只拷贝存储于栈中的内容,包括对象中简单类型的数据、指向其他复杂对象的指针等,但是不会将指向的复杂对象也拷贝一次。
package hello;/** * 原型模式 * * */public class ProtocolPattern{ public static void main(String args[]){ ColoneProtocol p1 = new ColoneProtocol("HelloWorld!"); Protocol p2 = (Protocol)p1.Clone(); System.out.println(p1.getName()+"****"+p2.getName()); 复制出来的对象,内存地址是不一样的。 }}class Protocol implements Cloneable{ private String name; public void setName(String n){ this.name = n; } public String getName(){ return this.name; } //将protected的clone方法提升至public类型 public Object Clone(){ try{ return super.clone(); }catch(Exception e){ e.printStackTrace(); return null; } }}class ColoneProtocol extends Protocol{ public ColoneProtocol(String n){ super.setName(n); }}