老聚 发表于 2013-1-6 02:21:23

设计模式学习笔记-原型模式

<div id="cnblogs_post_body">1. 概述
  通过复制一个已经存在的实例来创建一个新的实例。被复制的实例被称为原型,这个原型是可定制的。
2. 模式中的角色
  2.1 抽象原型类(Abstract Prototype):提供一个克隆接口
  2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类
3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事。其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简历。复制一份简历,然后做局部修改是最让人省心的了!
  3.1 实现类图
  http://pic002.cnblogs.com/images/2012/155937/2012062812204256.png
  类图解读
  在.NET中,System命名空间已经为我们提供了一个ICloneable接口,它包含了一个方法Clone(),实现这个接口就完成了原型模式。
  3.2 在写实现代码之前,先要理解一下深复制与浅复制。
    3.2.1 浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,则简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象;如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。例如, 如果一个对象有一个指向引用类型(如例子中的工作经历)的字段, 并且我们对该对象做了一个浅复制, 那麽两个对象将引用同一个引用(即同一段工作经历)。
    3.2.2 深复制:与浅复制不同之处在于对引用类型的处理,深复制将新对象中引用类型字段指向复制过的新对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。例如,如果一个对象有一个指向引用类型(如例子中的工作经历)的字段,并且对该对象做了一个深复制的话.我门将创建一个新的对象(即新的工作经历)。
  3.3 简历的浅复制实现
<div class="cnblogs_code">    /// <summary>    /// 实现了ICloneable接口的简历类    /// </summary>    public class Resume:ICloneable    {      public Resume()      {            mWorkExperience = new WorkExperience();      }      private string mName;      private string mSex;      private int mAge;      private WorkExperience mWorkExperience;      public string Name      {            get { return mName; }            set { mName = value; }      }      public string Sex      {            get { return mSex; }            set { mSex = value; }      }      public int Age      {            get { return mAge; }            set { mAge = value; }      }      /// <summary>      /// 关联了一个引用类型      /// </summary>      public WorkExperience WorkExperience         {             get { return mWorkExperience; }         }      public void SetWorkExperience(DateTime startDate, DateTime endDate, string company, string position)      {            this.mWorkExperience.Company = company;            this.mWorkExperience.EndDate = endDate;            this.mWorkExperience.StartDate = startDate;            this.mWorkExperience.Position = position;      }      /// <summary>      /// 实现ICloneable接口的Clone方法      /// </summary>      /// <returns></returns>      public object Clone()      {            // .Net 为我们提供的浅复制对象的方法            return this.MemberwiseClone();      }    }    /// <summary>    /// 工作经历类    /// </summary>    public class WorkExperience    {      public DateTime StartDate { get; set; }      public DateTime EndDate { get; set; }      public string Company { get; set; }      public string Position { get; set; }    }
页: [1]
查看完整版本: 设计模式学习笔记-原型模式