大话设计模式之原型模式中的复制
2013-03-06 15:46
357 查看
在软件中,创建一个对象需要花费不少时间,远没有选中,然后Ctrl C与Ctrl V来的快,通过这两个快捷键,就产生了你想要的一模一样的东东,虽然东东一样,但是内存地却不一样,这就跟设计模式中的原型模式差不多,我个人觉得,Ctrl C与Ctrl V就是原型模式的最好应用。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建细节。
结构图:
总结了一下,觉得设计模式中的原型模式,提供了两种复制方式,第一种是浅复制,第二种是深复制,都是复制,但效果却和直接复制不一样。
运行结果:
运行结果:
运行结果:
原型模式:
概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建细节。
结构图:
总结了一下,觉得设计模式中的原型模式,提供了两种复制方式,第一种是浅复制,第二种是深复制,都是复制,但效果却和直接复制不一样。
直接复制:
所谓的直接复制,就是借用“=”,将需要复制的内容传给对方,这种方法在传递过程中,传的其实是引用,而不是值,它并没有什么实际内容。static void Main(string[] args) { Resume a = new Resume("赵栗婧"); a.SetPersonalInfo("女", "20"); a.SetWorkExperience("2", "xx公司"); Resume b = a; Resume c = a; a.DisPlay(); b.DisPlay(); c.DisPlay(); } } class Resume { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } public void SetWorkExperience(string timeArea, string company) { this.timeArea = timeArea; this.company = company; } public void SetPersonalInfo(string sex, string age) { this.age = age; this.sex = sex; } public void DisPlay() { Console.WriteLine("{0}{1}{2}", name, sex, age); Console.WriteLine("{0}{1}", timeArea, company); } }
运行结果:
浅复制:
在,NET中,System命名空间中提供了ICloneable接口,所以只要实现这个接口,就可以实现浅复制和深复制,完成原型模式了,所以,由于复制经常使用,.NET提供了这个接口,所以就用不着Prototype这个原型模式中的抽象类了。static void Main(string[] args) { Resume a = new Resume("赵栗婧"); a.SetPersonalInfo("男", "20"); a.SetWorkExperience("2,", "xx公司"); a.DisPlay(); Resume b = (Resume)a.Clone(); //调用Clone,实现简历生成 b.SetPersonalInfo("女", "24"); b.DisPlay(); Resume c = (Resume)b.Clone(); c.SetWorkExperience("3,", "YY企业"); c.DisPlay(); } } class Resume:ICloneable //简历 { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } public void SetWorkExperience(string timeArea, string company) { this.timeArea = timeArea; this.company = company; } public void SetPersonalInfo(string sex, string age) { this.age = age; this.sex = sex; } public void DisPlay() { Console.WriteLine("{0}{1}{2}", name, sex, age); Console.WriteLine("{0}{1}", timeArea, company); } public object Clone() { return (object)this.MemberwiseClone (); } }
运行结果:
深复制:
浅复制中运用的MemberwiseClone()方法中,如果字段是值类型,那么此方法就对字段进行逐位复制,如果是引用类型,这只复制引用不复制引用的对象,也就是说一旦类当中有对象引用,那么引用的对象的数据时不会被复制下来。要想复制下来,就要使用深复制。static void Main(string[] args) { Resume a = new Resume("张磊磊"); a.SetWorkExperience("3,", "zz企业"); a.SetPersonalInfo("女", "23"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("2,", "yy公司"); Resume c = (Resume)a.Clone(); c.SetPersonalInfo("男", "23"); a.DisPlay(); b.DisPlay(); c.DisPlay(); } } //简历 class Resume : ICloneable { private string sex; private string name; private string age; private WorkExperience work; public Resume(string name) //名字 { this.name = name; work=new WorkExperience() ; } private Resume(WorkExperience work) //工作 { this.work = (WorkExperience)work.Clone(); } public void SetPersonalInfo(string sex, string age) //性别和年龄 { this .sex =sex ; this.age =age ; } public void SetWorkExperience(string workDate, string company) //设置工作经历 { work.WorkDate = workDate; work.Company = company; } public void DisPlay() //显示 { Console.WriteLine("{0}{1}{2}", name, sex, age); Console.WriteLine("工作经历是:{0}{1}", work.WorkDate, work.Company); } public Object Clone() { Resume obj = new Resume(this.work); obj.name = this.name; obj.sex = this.sex; obj.age = this.age; return obj; } } //工作经历 class WorkExperience : ICloneable { private string workDate; public string WorkDate { get { return workDate; } set { workDate = value; } } private string company; public string Company { get { return company; } set { company = value; } } public Object Clone() { return (Object)this.MemberwiseClone(); } }
运行结果:
相关文章推荐
- 大话设计模式--原型模式
- 原型模式深复制浅复制
- 大话设计模式学习(七)——原型模式
- 大话设计模式----原型模式
- 《大话设计模式》之原型模式
- C#原型模式之深复制实现
- 分析一下 原型模式的 UML 类图 。 复制对象, 深浅拷贝 月经贴 ,请回避
- 大话设计模式-原型模式学习总结
- 原型模式 -- 大话设计模式
- 原型模式 对象深浅复制
- 设计模式之原型模式——复制建立对象实例
- 大话设计模式(二)代理模式 工厂方法模式 原型模式 模板方法模式 迪米特法模式 外观模式
- 大话设计模式之原型模式
- 大话设计模式-原型模式
- 大话设计模式之原型模式
- 设计模式(六)-原型模式(Prototype Pattern)——通过复制生成实例
- 设计模式之九 原型模式-简历复制
- 原型模式(Prototype)以及深浅复制
- java设计模式---Prototype Pattern---原型模式(复制建立对象)
- 大话设计模式C++实现-第9章-原型模式