原型模式

      class Client
      {
          static void Main(string[] args)
          {
              // 孙悟空 原型
              MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing");
              // 变一个
              MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype;
              Console.WriteLine("Cloned1:\t"+cloneMonkeyKing.Id);
              // 变两个
              MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype;
              Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id);
              Console.ReadLine();
          }
      }
      public  abstract class MonkeyKingPrototype
      {
          public string Id { get; set; }
          public MonkeyKingPrototype(string id)
          {
              this.Id = id;
          }
          // 克隆方法,即孙大圣说“变”
          public abstract MonkeyKingPrototype Clone();
      }
      public class ConcretePrototype : MonkeyKingPrototype
      {
          public ConcretePrototype(string id)
              : base(id){ } 
          /// 浅拷贝              
          public override MonkeyKingPrototype Clone()
          {
              // 调用MemberwiseClone方法实现的是浅拷贝,另外还有深拷贝
              return (MonkeyKingPrototype)this.MemberwiseClone();
          }
      }

上面代码实现的浅拷贝的方式,浅拷贝是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那么这两个对象将引用同一个字符串,而深拷贝是对对象实例中字段引用的对象也进行拷贝,如果一个对象有一个指向字符串的字段,并且我们对该对象进行了深拷贝的话,那么我们将创建一个对象和一个新的字符串,新的对象将引用新的字符串。也就是说,执行深拷贝创建的新对象和原来对象不会共享任何东西,改变一个对象对另外一个对象没有任何影响,而执行浅拷贝创建的新对象与原来对象共享成员,改变一个对象,另外一个对象的成员也会改变。

原型模式的优点有:
原型模式向客户隐藏了创建新实例的复杂性
原型模式允许动态增加或较少产品类。
原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。
产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构

原型模式的缺点有:
每个类必须配备一个克隆方法
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候

posted @ 2023-04-25 16:12  泽哥的学习笔记  阅读(8)  评论(0编辑  收藏  举报