[23种设计模式汇总]设计模式_原型模式

[23种设计模式汇总]设计模式_原型模式

ID:15406327

大小:141.00 KB

页数:12页

时间:2018-08-03

[23种设计模式汇总]设计模式_原型模式_第1页
[23种设计模式汇总]设计模式_原型模式_第2页
[23种设计模式汇总]设计模式_原型模式_第3页
[23种设计模式汇总]设计模式_原型模式_第4页
[23种设计模式汇总]设计模式_原型模式_第5页
资源描述:

《[23种设计模式汇总]设计模式_原型模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、设计模式 原型模式 概述在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构。这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适。那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化?意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。结构图Prototype模式结构图生活中的例子Prototype模式使用原型实例指定创建对象的种类。新产品的原型通常是先于全部产品建立的,这样的原型是被动的,并不参与复制它自己。一个细胞的有丝分裂,产生两个同样的细胞,是一个扮演主动角色复制自己原型的例子

2、,这演示了原型模式。一个细胞分裂,产生两个同样基因型的细胞。换句话说,细胞克隆了自己。使用细胞分裂例子的Prototype模式对象图原型模式解说我们考虑这样一个场景,假定我们要开发一个调色板,用户单击调色板上任一个方块,将会返回一个对应的颜色的实例,下面我们看看如何通过原型模式来达到系统动态加载具体产品的目的。很自然,我们利用OO的思想,把每一种颜色作为一个对象,并为他们抽象出一个公用的父类,如下图:实现代码:publicabstractclassColor{publicabstractvoidDisplay();}publicclassRedColor:Color{publicoverri

3、devoidDisplay(){Console.WriteLine("Red'sRGBValuesare:255,0,0");}}publicclassGreenColor:Color{publicoverridevoidDisplay(){Console.WriteLine("Green'sRGBValuesare:0,255,0");}}客户程序需要某一种颜色的时候,只需要创建对应的具体类的实例就可以了。但是这样我们并没有达到封装变化点的目的,也许你会说,可以使用工厂方法模式,为每一个具体子类定义一个与其等级平行的工厂类,那么好,看一下实现:实现代码:publicabstractclas

4、sColorFactory{publicabstractColorCreate();}publicclassRedFactory:ColorFactory{publicoverrideColorCreate(){returnnewRedColor();}}publicclassGreenFactory:ColorFactory{publicoverrideColorCreate(){returnnewGreenColor();}}实现了这一步之后,可以看到,客户程序只要调用工厂方法就可以了。似乎我们用工厂方法模式来解决是没有问题的。但是,我们考虑的仅仅是封装了new变化,而没有考虑颜色的数量

5、是不断变化的,甚至可能是在程序运行的过程中动态增加和减少的,那么用这种方法实现,随着颜色数量的不断增加,子类的数量会迅速膨大,导致子类过多,显然用工厂方法模式有些不大合适。进一步思考,这些Color子类仅仅在初始化的颜色对象类别上有所不同。添加一个ColorTool这样的类,来参数化的它的实例,而这些实例是由Color支持和创建的。我们让ColorTool通过克隆或者拷贝一个Color子类的实例来创建新的Color,这个实例就是一个原型。如下图所示:实现代码:abstractclassColorPrototype{publicabstractColorPrototypeClone();}cl

6、assConcteteColorPrototype:ColorPrototype{privateint_red,_green,_blue;publicConcteteColorPrototype(intred,intgreen,intblue){this._red=red;this._green=green;this._blue=blue;}publicoverrideColorPrototypeClone(){//实现浅拷贝return(ColorPrototype)this.MemberwiseClone();}publicvoidDisplay(string_colorname){Co

7、nsole.WriteLine("{0}'sRGBValuesare:{1},{2},{3}",_colorname,_red,_green,_blue);}}classColorManager{Hashtablecolors=newHashtable();publicColorPrototypethis[stringname]{get{return(ColorPrototype)colors[name];}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。