1、 意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2、 适用性
- 当一个系统应该独立于它的产品创建、构成、表示时,要使用Prototype模式;
- 当要实例化的类是在运行时刻制定时。例如,通过动态装载;
- 为了避免创建一个与产品类层次平行的工厂类层次时;
- 当一个类的实例只能有几个不同状态组合中的一种时。
3、 结构
4、 参与者
Prototype
——声明一个克隆自身的接口。
ConcretePrototype
——实现一个克隆自身的操作。
Client
——让一个原型克隆自身从而创建一个新的对象。
5、 协作
客户请求一个原型克隆自身。
6、 效果
Prototype有许多和Abstract Factory和Builder一样的效果:它对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。此外,这些模式使客户无需改变即可使用与特定应用相关的类。
Property还有以下优点:
1)运行时刻增加和删除产品 Prototype允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统。它比其他创建型模式更灵活,因为客户可以在运行时刻建立和删除原型。
2)改变值以指定新对象 高度动态的系统允许你通过对象复合定义新的行为。
3)改变结构以指定新对象
4)减少子类的构造 Factory Method经常产生一个与产品类层次平行的Creator类层次。Prototype模式使得你克隆一个原型而不是请求一个工厂方法去产生一个新的对象。因此你根本不需要Creator类层次。
5)用动态类配置应用 一些运行时刻环境允许你动态将类装载到应用中。一个希望创建动态载入类的实例的应用不能静态引用类的构造器。而应该由运行环境在载入时自动创建每个类的实例,并用原型管理器来注册这个实例。
Prototype的主要缺陷是每一个Prototype的子类都必须实现Clone()操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增Clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很难。
7、 实现
实现原型时,要考虑下面问题:
1)使用一个原型管理器 当一个系统中原型数目不固定时(也就是说,它们可以动态创建和销毁),要保持一个可用原型的注册表。客户不会自己来管理原型,但会在注册表中存储和检索原型。客户在克隆一个原型前会向注册表请求该原型。
2)实现克隆操作 Prototype模式最困难的部分在于正确实现clone操作。当对象结构包含循环引用时,这尤为棘手。克隆一个结构复杂的原型通常需要深拷贝,因为复制对象和原对象必须相互独立。
3)初始化克隆对象
8、 代码示例
Prototype
- package com.examples.pattern.prototype;
- publicclass Prototype implements Cloneable {
- private String name;
- public String getName() {
- returnname;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- public Object clone(){
- try {
- returnsuper.clone();
- } catch (CloneNotSupportedException e) {
- e.printStackTrace();
- returnnull;
- }
- }
- }
- package com.examples.pattern.prototype;
- publicclass ConcretePrototype extends Prototype {
- public ConcretePrototype(String name) {
- setName(name);
- }
- }
Client
- package com.examples.pattern.prototype;
- publicclass Client {
- publicstaticvoid main(String[] args) {
- Prototype pro = new ConcretePrototype("prototype");
- Prototype pro2 = (Prototype) pro.clone();
- System.out.println(pro.getName());
- System.out.println(pro2.getName());
- }
- }
9、 相关模式
Prototype和Abstract Factory模式在某种方面是相互竞争的。但是它们也可以一起使用。Abstract Factory可以存储一个被克隆的原型的集合,并且返回产品对象。
大量使用Composite和Decorator模式的设计通常也可以从Prototype模式处获益。