1、意图
- 用原型实例指定创建对象的种类,并且通过“拷贝这些原型”创建新的对象。
2、问题
- 当一个系统应该独立于它的产品创建、构成和表示时;
- 当要实例化的类是在运行时指定时(如动态装载);
- 为了避免创建一个与产品类层次平行的工厂类层次时;
- 当一个类的实例只能有几个不同状态组合中的一种时。
3、解决方案
- 创建产品时,根据原型参数,克隆一个新产品。
4、通用结构
5、参与者
- Prototype:声明一个克隆自身的接口
- ConcretePrototype:实现一个克隆自身的操作
- Client:通过原型参数克隆自身创建新对象
6、协作
- 客户请求一个原型,并用之克隆自身。
7、效果
- 运行时刻增加和删除产品 Prototype模式允许只通过注册原型实例就可以将一个新的具体产品类并入系统。
- 改变值以指定新对象 高度动态的系统允许你通过对象复合定义新的行为(不定义新的类)。通过实例化已有类并且将这些实例注册为客户对象的原型。就可以有效定义新类别的对象。客户可以将职责代理给原型,从而表现出新的行为。
- 改变结构以指定新对象 许多应用由部件和子部件来创建对象,对于复合结构对象,只要将Clone实现为深拷贝,也可以成为原型。
- 减少子类的构造 这一优点主要适用于像C++这样不将类作为一级类对象的语言。
- 用类动态配置应用 一个希望创建动态载入类的实例的应用不能静态引用类的构造器。而应该有运行环境在载入时自动创建每个类的实例,并用原型管理器来注册这个实例。这样应用就可以向原型管理器请求新装载的类的实例,这些类原本并没有和程序相连接。
8、实现
1)使用一个原型管理器:当一个系统中原型数目不固定时(以动态创建和销毁),要保持一个可用原型的注册表。客户不会自己来管理原型,但会在注册表中存储和检索原型。客户在克隆一个原型前会向注册表请求该原型,这个注册表为原型管理器。
原型管理器是一个关联存储器,它返回一个与给定关键字相匹配的原型。它有通过关键字注册和销毁原型的一些操作。因此客户可以下运行时更改甚至浏览这个注册表,这使得客户无需编写代码就可以扩展并得到系统清单。2)实现克隆操作:浅拷贝与深拷贝问题
3)初始化克隆对象:通过定义的其他接口,为克隆的新对象实例初始化。
9、实例