个人在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7851293

以下是读《设计模式——可复用面向对象软件的基础》的读书笔记。

PROTOTYPE 原型

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;}}
}

ConcretePrototype


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模式处获益。

转载于:https://blog.51cto.com/guanzhenxing/973003

设计模式——原型模式相关推荐

  1. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  2. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  3. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  6. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  7. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  8. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  9. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

  10. Java设计模式——原型模式

    概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...

最新文章

  1. 《每周CV论文》人脸识别难题:遮挡年龄姿态妆造亲属伪造攻击
  2. 2020 5月 每日花语
  3. 加分二叉树 java_P1040 加分二叉树
  4. 批处理 设置电脑最佳性能_批处理最佳做法
  5. vim QuickFix 窗口
  6. 【测试】软件测试分类体系系统学习
  7. Go,11 岁生日快乐!
  8. html 圆饼画布,html5 canvas画饼
  9. @Configuration与@Component作为配置类的区别
  10. delete了,析构函数却没有调用
  11. android5.0百度地图,百度地图安卓版5.0.0 官方版
  12. GHOSTXPSP3电脑爱好者V9.9美化版
  13. 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW)
  14. wamp5虚拟主机的配置
  15. java微信小程序的在线学习平台
  16. SSH java 面试题
  17. 2017年/2月/9日/美签B1/B2流程(供参考)
  18. MTK 虚拟 sensor bring up (pick up) sensor1.0
  19. windows系统DOS窗口
  20. lunix 习题 设计一个程序 cuts,它由标准输入读取数据...

热门文章

  1. MYSQL增量备份和全量备份脚本分享
  2. 再议libcurl编程
  3. php 实现的n,php 实现数据N等分。
  4. 硬件密码组件的硬件结构、作用及实现应用设计
  5. 算法入门篇二 认识O(NlogN)的排序
  6. 笔记本电池的正确使用方法
  7. 利用C语言实现计算机图像处理的方法
  8. 项目经理如何把工作简单化
  9. 超详细 图解 : IntelliJ IDEA 逆向生成 JAVA 实体类
  10. Cron表达式、定时任务