8.原型模式

原理

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决
【8.原型模式】在运行期建立和删除原型。
应用实例:
细胞分裂。
代码 Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 原型模式 { class Program { static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男","29"); a.SetWorkExperience("1998-2000","xx公司"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("1998-2003","yy企业"); Resume c = (Resume)a.Clone(); c.SetPersonalInfo("男", "24"); a.Display(); b.Display(); c.Display(); Console.ReadKey(); } } }

Resume.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //浅复制:如果字段是值类型,则对该字段执行逐位复制 //深复制:如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象集其复本引用同一对象 namespace 原型模式 { 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(); }}//.Net提供了ICloneable接口,其中唯一的方法就是Clone(), 这样只要实现这个接口就可以完成原型模式 class Resume : ICloneable { private string name; private string sex; 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; } } }

    推荐阅读