赞
踩
别名:克隆模式、Prototype
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
在程序设计中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。
问题来了:
如何创建易变类的实体对象?
解决方案:
采用“原型克隆”的方法来做,它是的我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象 – 所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断的Clone
要点:
原型设计模式用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它要求这些易变类拥有稳定的接口。
优点:
缺点:
适用性:
实现方式:
this.MemberwiseClone();
来实现浅拷贝。而深拷贝我们可以通过序列化去实现。拓展:什么是“浅拷贝和深拷贝”?
可以简单理解为,浅拷贝是List<int> a = new List<int>(); List<int> b = a;
, 集合a,b同指向一个内存修改a中的值即修改了b中的值;而深拷贝是List<int> a = new List<int>(); List<int> b = new List<int>(a);
new了一个集合b并且将a中的数据全部复制过去了,此时a,b没有任何关系。
示例代码:
class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Age = 22; p1.Name = "Czhenya"; p1.IdInfo = new IdInfo(111); // 对p1执行一个浅拷贝,并将其赋值给p2。 Person p2 = p1.ShallowCopy(); // 对p1做一个深度拷贝,并把它赋值给p3。 Person p3 = p1.DeepCopy(); Console.WriteLine("----- p1, p2, p3的原始值: -----"); Console.WriteLine("--- 原数据 P1 :"); DisplayValues(p1); Console.WriteLine("--- 浅拷贝 P2 :"); DisplayValues(p2); Console.WriteLine("--- 深拷贝 P3 :"); DisplayValues(p3); // 更改p1属性的值并显示p1的值 p1.Age = 33; p1.Name = "Czy"; p1.IdInfo.IdNumber = 222; Console.WriteLine(); Console.WriteLine("----- 对原数据p1 进行修改后 p1、p2、p3的值: -----") Console.WriteLine("+++ 原数据 P1 :"); DisplayValues(p1); Console.WriteLine("+++ 浅拷贝 P2 :"); DisplayValues(p2); Console.WriteLine("+++ 深拷贝 P3 :"); DisplayValues(p3); Console.ReadKey(); } static void DisplayValues(Person p) { Console.WriteLine("姓名: {0:s}, 年龄: {1:d}, ID: {2:d}", p.Name, p.Age } } /// <summary> /// 原类型 -- 需要被拷贝的类 /// </summary> public class Person { // 多种类型数据,查看拷贝后的数据 public int Age; public string Name; public IdInfo IdInfo; /// <summary> /// 浅拷贝 /// MemberwiseClone -- 按成员拷贝(复制引用类型的地址,而不是new) /// </summary> /// <returns></returns> public Person ShallowCopy() { return (Person)this.MemberwiseClone(); } /// <summary> /// 深拷贝 /// </summary> /// <returns></returns> public Person DeepCopy() { Person clone = (Person)this.MemberwiseClone(); // int Age 这种简单类型不需要管,在MemberwiseClone处理了 // 引用类型 clone.IdInfo = new IdInfo(IdInfo.IdNumber); return clone; } } // 作为引用类型的数据 public class IdInfo { public int IdNumber; public IdInfo(int idNumber) { this.IdNumber = idNumber; } }
测试结果:
设计模式系列博文示例代码工程:链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。