原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象创建另外一个可以定制的对象,而且客户是不需要知道任何创建的细节的。原型模式给每一个产品类配备一个克隆方法(大多的时候只需要给产品等级结构的顶级类配备一个克隆方法即可),这样,一个使用了原型模式的系统与他的产品对象时怎么创建出来的,以及这些产品对象的结构式怎样的,以及这个结构是否会发生变化就没有关系了。原型模式的结构图如下
图 1. 原型设计模式结构图
原型模式中涉及到了三种角色,分别是客户角色、抽象原型角色、具体原型角色。
客户角色:客户提出创建对象的需求;
抽象原型角色:提供所有具体原型类的克隆接口;
具体原型角色:被复制的对象,此角色需要实现抽象的原型角色所要求的接口。
原型模式中的对象复制
原型模式对对象的克隆会涉及到对象的复制,由于对象封装了数据和操作,所以就会涉及到数据的复制,这是也就有了深复制和浅复制的区分。
浅复制,只会复制所有数据成员的值,换言之,其只会复制值类型成员,对于引用类型仍然保留原来的引用,并不会对其进行复制。
深复制,就是要实现所有的值类型成员都要含有与原来相同的值,所有引用类型的成员要指向具有相等值的不同的对象。换言之,就是其要对所有的成员进行复制一遍。深复制要深入到多少层,是一个不易确定的问题。在决定以深复制的方式复制一个对象的时候,必须决定对引用类型成员是采取浅复制还是深复制。因此,在采取深复制的时候,需要决定复制的深度,此外复制的过程中,很可能会出现循环引用的问题,必须小心处理。
JBPM中的原型模式
原型模式是一个相对比较简单的模式,JBPM中对unix-like cron expression的解析和计算求值,使用了原型模式,其结构如下图所示
图 2. JBPM中的原型模式
抽象原型角色:java中的ICloneable接口充当了此角色,提供了原型模式需要的克隆接口clone.
具体原型角色:CronExpression实现了clone方法。
原型模式的特点
1. 原型模型模式允许动态地增减或减少产品类。由于常见产品类实例的方法是产品类
内部具有的,因此,增加新产品对整个结构没有影响。
2. 原型模式提供简化的创建结构。工厂方法模式等常常需要有一个与产品等级结构相同的结构,而原型模式则不需要。
3. 产品类不需要有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
4. 原始类型模式最主要的缺点是每一个类都需要一个克隆方法,这需要对类的功能进行通判考虑,这对于全新的类来说不是很难的,但是对于已经有的类不一定很容易,
特别是当一个类含有循环结构的时候。