预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://bbs.51aspx.com/topictag-2024.aspx"设计模式HYPERLINK"http://bbs.51aspx.com/topictag-2046.aspx"原型模式 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构。这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适。那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 结构图 Prototype模式结构图 生活中的例子 Prototype模式使用原型实例指定创建对象的种类。新产品的原型通常是先于全部产品建立的,这样的原型是被动的,并不参与复制它自己。一个细胞的有丝分裂,产生两个同样的细胞,是一个扮演主动角色复制自己原型的例子,这演示了原型模式。一个细胞分裂,产生两个同样基因型的细胞。换句话说,细胞克隆了自己。 使用细胞分裂例子的Prototype模式对象图 原型模式解说 我们考虑这样一个场景,假定我们要开发一个调色板,用户单击调色板上任一个方块,将会返回一个对应的颜色的实例,下面我们看看如何通过原型模式来达到系统动态加载具体产品的目的。 很自然,我们利用OO的思想,把每一种颜色作为一个对象,并为他们抽象出一个公用的父类,如下图: 实现代码: publicabstractclassColor { publicabstractvoidDisplay(); } publicclassRedColor:Color { publicoverridevoidDisplay() { Console.WriteLine("Red'sRGBValuesare:255,0,0"); } } publicclassGreenColor:Color { publicoverridevoidDisplay() { Console.WriteLine("Green'sRGBValuesare:0,255,0"); } } 客户程序需要某一种颜色的时候,只需要创建对应的具体类的实例就可以了。但是这样我们并没有达到封装变化点的目的,也许你会说,可以使用工厂方法模式,为每一个具体子类定义一个与其等级平行的工厂类,那么好,看一下实现: 实现代码: publicabstractclassColorFactory { publicabstractColorCreate(); } publicclassRedFactory:ColorFactory { publicoverrideColorCreate() { returnnewRedColor(); } } publicclassGreenFactory:ColorFactory { publicoverrideColorCreate() { returnnewGreenColor(); } } 实现了这一步之后,可以看到,客户程序只要调用工厂方法就可以了。似乎我们用工厂方法模式来解决是没有问题的。但是,我们考虑的仅仅是封装了new变化,而没有考虑颜色的数量是不断变化的,甚至可能是在程序运行的过程中动态增加和减少的,那么用这种方法实现,随着颜色数量的不断增加,子类的数量会迅速膨大,导致子类过多,显然用工厂方法模式有些不大合适。 进一步思考,这些Color子类仅仅在初始化的颜色对象类别上有所不同。添加一个ColorTool这样的类,来参数化的它的实例,而这些实例是由Color支持和创建的。我们让ColorTool通过克隆或者拷贝一个Color子类的实例来创建新的Color,这个实例就是一个原型。如下图所示: 实现代码: abstractclassColorPrototype { publicabstractColorPrototypeClone(); } classConcteteColorPrototype: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_colornam