设计模式在综合前置中的运用(四)--原型模式

来源:互联网 发布:c语言删除文件内容 编辑:程序博客网 时间:2024/05/29 04:45

我们先看看原型模式的基本定义。原型模式的英文为ProtoType,它用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。该模式的适用性如下:

1、当要实例化的类是在运行时刻指定时,例如,通过动态装载。

2、为了避免创建一个与产品类层次平行的工厂类层次时。

3、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

原型模式的组成如下:

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

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

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

来看一下这些角色组成的类图:


接下来谈谈原型模式在综合前置中的运用。系统中有很多地方都需要使用对类的clone方法,下面以全局上下文的设计为例进行说明。类图如下:


Context为全局上下文类,保存了一些全局数据,并提供了clone方法来复制自己。AtomService为原子服务处理类,它实现了execute方法来完成对原子服务的具体处理过程,该方法调用了Context的clone方法来复制Context实例。

对比原型模式来看,AtomService为客户角色,Context为具体原型角色。虽然该设计中并未设计抽象原型角色,但客户角色通过调用具体原型角色的克隆方法,使对具体原型角色的复制比手工实例化更加容易。全局上下文Context实例中保存了很多全局关键数据,而原子服务处理类在完成功能的时候需要拷贝Context实例以保证在异步处理时的线程安全性,由于Context提供了clone方法,这样原子服务处理类在对Context实例复制时就不需要关心Context的内部细节,只需要调用clone方法即可。当然由于本设计中未设计抽象原型角色,因此只有一个具体原型角色,在扩展上不如经典的原型模式。虽然本系统并不需要对全局上下文进行扩展,但我们可以对此设计进行优化,具体类图如下:


如上图所示,新增加了一个ContextPrototype接口,即全局上下文原型类,承担抽象原型角色。Context类实现ConTextPrototype接口,为具体原型角色。这样,今后当有不同的全局上下文实现需求时,可以通过重新实现ContextPrototype接口来进行扩展。

0 0
原创粉丝点击