原型模式

[ Prototype ]

用原型实例指定创建对象的种类 , 并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象 , 而且不需知道任何创建的细节



原型模式分为 : 浅拷贝 和 深拷贝

浅拷贝 : 值类型 会逐位复制 , 引用类型 则复制引用但不复制引用的对象 , 因此 原始对象及其复本引用同一对象。
深拷贝 : 把引用对象的变量指向复制过的新对象 , 而不是原有的被引用的对象。 必须实现 ICloneable 接口




源码:

class Work : ICloneable
{
  private string _timeArea;
  private string _company;
  public string TimeArea {
    set { _timeArea = value; }
    get { return _timeArea; }
  }
  public string Company {
    set { _company = value; }
    get { return _company; }
  }

  #region ICloneable 成员

  public object Clone()
  {
    return (object)this.MemberwiseClone();
  }

  #endregion
}




class Resume : ICloneable
{
  private string _Name;
  private string _Sex;
  private string _Age;
  private Work work;

  public Resume(string name)
  {
    _Name = name;
    work = new Work();
  }

  public Resume(Work work)
  {
    this.work = (Work)work.Clone(); 这里决定了深拷贝
  }


  // <summary>
  // 设置个人信息
  // </summary>
  // <param name="sex"></param>
  // <param name="age"></param>
  public void SetPersonalInfo(string sex, string age)
  {
    _Sex = sex;
    _Age = age;
  }


  // <summary>
  // 设置工作经历
  // </summary>
  // <param name="timeArea"></param>
  // <param name="company"></param>
  
public void SetWorkExperience(string timeArea, string company)
  {
    work.TimeArea = timeArea;
    work.Company = company;
  }


  // <summary>
  // 显示
  // </summary>
  public void Display()
  {
    Console.WriteLine("{0} {1} {2}",_Name,_Sex,_Age);
    Console.WriteLine("工作经历: {0} {1}",work.TimeArea,work.Company);
  }

  public Object Clone()
  {
    Resume obj = new Resume(this.work);
    obj._Age = this._Age;
    obj._Name = this._Name;
    obj._Sex = this._Sex;
    return obj;
  }
}




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("2000-2002", "yy公司");


    Resume c = (Resume)a.Clone();
    c.SetWorkExperience("2002-2010", "zz公司");


    a.Display();
    b.Display();
    c.Display();

    Console.ReadKey();

  }
}

posted on 2012-02-21 12:02  多个马甲  阅读(189)  评论(0编辑  收藏  举报