原型模式之深复制和浅复制

看了原型模式,觉着和C#中讲的值类型和引用类型很相似,不妨先来复习一下值类型和引用类型吧

值类型:

<span style="font-size:18px;"> Public struct Person
 {
   private string _name;
   public string name
   {
      get{return _name;}
      set{_name=value;}
   }
  --------------//声明年龄
  ---------------//声明性别
 }
 Static void Main()
 {
  Person p1=new Person();
  p1.Age=20;
  p1.Gender='男';
  Person p2=new Person();
  p2=p1;
  p2.Age=30;
  p2.Gender='女';
 }
  结果 p1: 20 男
       p2: 30 女</span>


引用类型:


<span style="font-size:18px;">Public class Person
 {
   private string _name;
   public string name
   {
      get{return _name;}
      set{_name=value;}
   }
  --------------//声明年龄
  ---------------//声明性别
 }
主函数相同</span>

结果 p1: 30女
         p2:30女



原型模式之深复制和浅复制_第1张图片原型模式之深复制和浅复制_第2张图片


值类型的值存在栈上,引用类型栈上存的是地址,值在堆上。枚举、结构、int 、decimal等类型是值类型的是传递拷贝。对象(引用类型)则是传递引用。类 、string、数组是引用类型。


言归正传,深复制和浅复制是同样的道理

浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深复制:把引用对象的变量指向复制过的新对象而不是原有的被引用的对象。

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

MemberwiseClonce()方法:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一个对象。

浅复制UML图解:

原型模式之深复制和浅复制_第3张图片



原型模式之深复制和浅复制_第4张图片

      



你可能感兴趣的:(原型模式之深复制和浅复制)