爱 一个微笑开始 一滴眼泪结束
2008-04-21 12:26
274 查看
个人在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
ConcretePrototype
Client
9、 相关模式
Prototype和Abstract Factory模式在某种方面是相互竞争的。但是它们也可以一起使用。Abstract Factory可以存储一个被克隆的原型的集合,并且返回产品对象。
大量使用Composite和Decorator模式的设计通常也可以从Prototype模式处获益。
本文出自 “前进前进” 博客,请务必保留此出处http://guanzhenxing.blog.51cto.com/4022177/973003
以下是读《设计模式——可复用面向对象软件的基础》的读书笔记。
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模式处获益。
本文出自 “前进前进” 博客,请务必保留此出处http://guanzhenxing.blog.51cto.com/4022177/973003
相关文章推荐
- 爱,由一个笑容开始,由一滴眼泪结束
- 爱,由一个笑容开始,由一滴眼泪结束
- 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,
- 获取当天的开始时间、结束时间等等的一个工具类
- 一个MapReuce作业的从开始到结束--第1章 NameNode节点的格式化
- 一个结束,一个开始
- 爱,从一个微笑开始
- 给你一个二叉树,其中每个节点都包含一个整数值。查找总和给定值的路径数,路径不需要在根或叶子处开始或结束,但必须向下
- 12月21日,一个周期的结束又是另一个周期开始
- php 读取一个文档的任意开始行数与结束行数
- 编写一个函数,删除字符串中的一段字符,函数原型为: int fun(char *p,int start,int end); 返回值为删除字符数, start 开始位置,end 结束位置。
- 一个MapReuce作业的从开始到结束--第4章 DataNode节点启动分析
- 一个项目从开始到结束-1
- 给一个开始日期加上一个天数,计算结束日期
- Android 如何监听一个线程的开始和结束
- 爱从一个微笑开始
- 一个项目从开始到结束
- 写一个oracle的sequence 从100开始 到99999结束 每次增长为2
- 一个MapReuce作业的从开始到结束--第5章 把文件复制到HDFS的流程
- 给一个时间获取,今日凌晨、昨日凌晨、本周开始时间、本周结束时间、本月开始时间、本月结束时间