第 9 章 —— 原型模式

9.3 原型模式

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

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

  抽象原型类:

    abstract class Prototype
    {
        private string id;

        public Prototype(string id)
        {
            this.id = id;
        }

        public string Id
        {
            get { return id; }
        }

        public abstract Prototype Clone();          //抽象类关键就是有这样一个Clone方法
    }

  具体原型类:

    class ConcretePrototype : Prototype
    {
        public ConcretePrototype(string id) : base(id)
        { }

        public override Prototype Clone()
        {
            return (Prototype)this.MemberwiseClone();       //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,
            //则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其副本引用为同一对象
        }
    }

  客户端代码:

        static void Main(string[] args)
        {
            ConcretePrototype p1 = new ConcretePrototype("I");
            ConcretePrototype c1 = (ConcretePrototype)p1.Clone();       //克隆ConcretePrototype的对象p1就能得到新的实例c1
            Console.WriteLine("Cloned:{0}", c1.Id);

            Console.Read();
        }

    一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。

9.5 浅复制与深复制

    MemberwiseClone() 方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。换句话说就是,如果你的“简历”类当中有对象引用,

  那么引用的对象数据是不会被克隆过来的。

    举个例子你就明白了,你现在的“简历”类当中有一个“设置工作经历”的方法,在显示设计当中,一般会再有一个“工作经历”类,当中有“时间区间”和“公司名称”等属性,“简历”类直接调用这个对象即可。

  工作经历类:

      class WorkExperience
      {
          public string WorkDate { get; set; }      //好像是使用这种方式类中所有的属性都要使用这种方式,所以这种方式好像只适合那些其他方法并不调用私有变量的类
          public string Company { get; set; }
      }

  简历类:

原文地址:https://www.cnblogs.com/zhangchaoran/p/8547598.html