设计模式之原型模式

  原型模式亦是一种创建型模式,同样适用于对象的创建。GOF给它的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  提到原型模式不得不提Java提供的clone()方法,clone方法作用就是复制一个对象且不会影响原对象,属于内存级复制,这就是原型模式的很好的例子。

  使用克隆方式来创建对象与同样用来创建对象的工厂模式有什么不同呢?工厂模式对于新产品的适应能力比较弱,创建新的产品时必须修改或者增加工厂角色,代码改动较大。通过原型模式来创建对象的过程则是:

  先来看看原型模式的结构图:

    1、客户角色:让一个原型克隆自己来得到一个新的对象;

    2、抽象原型角色:实现了自己的clone方法,扮演这种角色的类通常是抽象类且具有许多具体的子类;

    3、具体原型角色:被复制的对象,为抽象原型角色的具体子类;

    4、原型管理器:负责对象原型的生成和克隆,维护已有原型的清单,客户在使用时会向原型管理器发出请求,而且可以修改原型管理器维护的清单。

  如何使用原型模式呢,我们还是看一段代码来加深印象:

1 //先new一个具体原型角色作为样本
2 Prototype p =  new ConcretePrototype();
3 。。。
4 //使用原型P克隆出一个新对象p1
5 Prototype p1 = (Prototype)p.clone();

  当然使用原型管理器之后的对象创建却不是这样的:

//使用原型管理器后,获取对象的方式
Prototype p1 = PrototypeManager.getManager().getPrototype("ConcretePrototype");

  一般使用HashMap来管理原型对象的清单。

  那么什么时机使用原型模式能给代码较好的增益呢?如果一个对象的创建总是由几种固定组件不同方式组合而成;如果对象之间仅仅实例属性不同。将不同的情况对象缓存起来,直接克隆使用是提高代码效率的很好的方法。

  PS:原型模式中使用的clone方法能够动态地抽取当前对象运行时的状态并且内存级别克隆到新的对象中;而new方法只能得到一个所有属性初始化的对象,效率也会低得多(对象属性很吃资源的情况下)。

posted @ 2014-11-19 19:08  Simba.Chen  阅读(194)  评论(0编辑  收藏  举报