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

来源:互联网 发布:linux系统制作iso镜像 编辑:程序博客网 时间:2024/06/07 02:05

看了原型模式,觉着和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女





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


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

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

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

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

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

浅复制UML图解:





      



1 0