设计模式原型模式Prototype)

上传人:新** 文档编号:486191825 上传时间:2023-03-21 格式:DOC 页数:9 大小:23KB
返回 下载 相关 举报
设计模式原型模式Prototype)_第1页
第1页 / 共9页
设计模式原型模式Prototype)_第2页
第2页 / 共9页
设计模式原型模式Prototype)_第3页
第3页 / 共9页
设计模式原型模式Prototype)_第4页
第4页 / 共9页
设计模式原型模式Prototype)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《设计模式原型模式Prototype)》由会员分享,可在线阅读,更多相关《设计模式原型模式Prototype)(9页珍藏版)》请在金锄头文库上搜索。

1、设计模式原型模式(Prototype) 面馆里的菜单 设计模式原型模式参考资料c#技术揭密设计模式可复用面向对象软件的基础java与模式很多餐馆里面都有菜单,列举了他们提供哪些饭菜,哪种面食等,一般的兰州拉面馆里菜单是这样的牛肉拉面(大碗 )牛肉拉面(小碗)牛肉刀削面羊肉拉面羊肉刀削面你到了这里,你说我要吃手擀面,我要吃挂面,我要吃珍珠翡翠鲍鱼面,他恐怕没有,这些面就需要定制,上面说的牛肉拉面,牛肉刀削面等可以看作是原型,面馆可以看作是原型管理器。原型模式在创建对象不是直接创建的,也就是说,不是通过外部调用类的构造函数调用的,而是通过已存在的对象实例克隆出一个对象,这个克隆对象和他的源对象具有

2、相同的属性和状态,也就是说面馆里的牛肉刀削面每一碗状态都是一样的。克隆对象分为浅拷贝和深拷贝浅拷贝就是克隆的对象和它的源对象共享引用的对象,举个例子,可能不恰当,假设牛肉刀削面引用一个对象:Money,表示它值多少钱,这里说的对象是说它是System.Object继承的(c#), 也就是说不同的浅拷贝对象,他们的价钱是一样的,当克隆对象的价钱变过之后,它所引用的对象的价钱也就随之改变了,比如面馆调低了牛肉刀削面的价格,由5块钱调到了4块钱,那么每碗面的价格都变到了四块钱。但对值类型而言,每个浅拷贝对象都有自己的拷贝,也就是说,当改变克隆对象的值类型时,它的源对象相应属性不会改变。深拷贝就是完全

3、的拷贝不仅值类型有自己的拷贝,连引用对象也有自己的一份拷贝,修改克隆对象的任何属性,也不会对源对象产生任何影响。原型管理器,就是提供原型注册使用,当创建对象使,可以使用里面的对象进行克隆,当有新的实例对象时,也可以将他们加到原型管理器里。说的有点乱,程序员,还是用代码交流最好,下面的程序分别实现了原型克隆时浅拷贝和深拷贝。/理解深拷贝和浅拷贝/浅表副本创建与原始对象具有相同类型的新实例,然后复制原始对象的非静态字段。/如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制该/引用但不复制被引用的对象;这样,原始对象中的引用和复本中的引用指向同一个对象。/相反,对象的深层副本复制

4、对象中字段直接或间接引用的全部内容。/例如,如果 X 是一个具有对对象 A 和对象 B 的引用的 Object,并且对象 A 还具/有对对象 M 的引用,则 X 的浅表副本是对象 Y,而 Y 同样具有对对象 A 和对象 B /的引用。相反,X 的深层副本是对象 Y,而对象 Y 具有对对象 C 和对象 D 的直接引/用以及对对象 N 的间接引用,其中 C 是 A 的副本,D 是 B 的副本,而 N 是 M 的副本。using System;using System.Collections;using System.IO;using System.Runtime.Serialization.For

5、matters.Binary;using System.Runtime.Serialization;using System.Data;namespace Prototype/ / Prototype类型实例/ class TestPrototypeApp/ / 应用程序的主入口点。/ STAThreadstatic void Main(string args)/定义原型管理器NoodleManager noodleManager=new NoodleManager();/客户要求下面三碗面Noodle beefNoodle=(Noodle)noodleManager牛肉拉面.Clone();

6、/Noodle beefNoodle=(Noodle)noodleManager牛肉拉面.DeepClone();Noodle muttonNoodle=(Noodle)noodleManager羊肉拉面.Clone();Noodle beefCutNoodle=(Noodle)noodleManager牛肉刀削面.Clone();/修改克隆对象中的引用对象的属性,验证它是浅拷贝还是深拷贝beefNoodle.TbName=,哈哈哈!,克隆对象改名了,你改不改;/显示原始对象的NoodelName和TbNameConsole.WriteLine(noodleManager牛肉拉面.Noodle

7、Name+noodleManager牛肉拉面.TbName+n);/显示克隆对象的NoodleName和TbNameConsole.WriteLine(beefNoodle.NoodleName+beefNoodle.TbName+n);/将新的产品加入原型管理器,以备以后克隆时使用,下面是定义了一种新的面条羊肉刀削面, /并把它添加到面条管理器中,如果以后再有客户点这个面,直接克隆即可。noodleManager羊肉刀削面=new CutNoodle(羊肉刀削面);/克隆一碗羊肉刀削面Noodle muttonCutNoodle=(Noodle)noodleManager羊肉刀削面.Clon

8、e();Console.WriteLine(noodleManager羊肉刀削面.NoodleName+n);Console.WriteLine(muttonCutNoodle.NoodleName+n);Console.ReadLine();/抽象产品面条/序列化属性,为深拷贝时使用,每个派生类都要加上此属性才能实现深拷贝Serializablepublic abstract class Noodle/定义一个DataTable对象,主要是为了验证对比类中含有引用对象时的深拷贝和浅拷贝时的不同,/你也可以采用别的任何引用对象protected DataTable dataTable=new

9、DataTable();public string TbNamegetreturn dataTable.TableName;setdataTable.TableName=value;/字段protected string noodleName;/特性public string NoodleNamegetreturn noodleName;setnoodleName=value;public abstract Noodle Make(string name);/浅克隆的接口public abstract Noodle Clone();/深克隆的接口public abstract Noodle D

10、eepClone();/具体产品,拉面Serializablepublic class PullNoodle:Noodlepublic PullNoodle(string name)this.NoodleName=name;this.TbName=name+table;Console.WriteLine(PullNoodle is maden);/实现浅拷贝public override Noodle Clone()return (Noodle)this.MemberwiseClone();/实现深拷贝,“淹咸菜”的过程,先将对象序列化到内存流,再反序列化,即可得到深克隆public over

11、ride Noodle DeepClone()/定义内存流MemoryStream ms=new MemoryStream();/定义二进制流IFormatter bf=new BinaryFormatter();/序列化bf.Serialize(ms,this);/重置指针到起始位置,以备反序列化ms.Position=0;/返回反序列化的深克隆对象return (Noodle)bf.Deserialize(ms);public override Noodle Make(string name)return new PullNoodle(name);/具体产品刀削面Serializablepublic class CutNoodle:Noodlepublic CutNoodle(string name)this.NoodleName=name;this.TbName=name+table;Console.WriteLine(CutNoodle is maden);/实现浅克隆public override Noodle Clone()return (Noodle)this.MemberwiseClone();public override Noodle Make(string name)return new CutNoodle(name);/实现深克隆public over

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号