原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。其实所谓的原型模式本质上是在勒种预留的对对象的复制接口。对于一些初始化信息发生变化不大的情况下,可以采用Clone的方式创建对象,不用每次都是重新初始化对象。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
- 浅拷贝
在.Net中,System命名空间中提供了ICloneable接口,唯一一个方式Clone()实现该接口就可以实现原型模式public Object Clone() { return this.MemberwiseClone(); }
但是MemberwiseClone()只能实现浅拷贝:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但是不复制引用的对象,对于引用字段而言原始对象中的字段和副本中的字段使用同一对象。
- 深拷贝
深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在C#中可以使用序列化和反序列化来实现深拷贝用到的命名空间
///二进制序列化
/// using System.IO;
/// using System.Runtime.Serialization.Formatters.Binary;
public RootPrivilege DeepCopy()
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
//序列化成流
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
//反序列化成对象
retval = bf.Deserialize(ms);
ms.Close();
}
return (RootPrivilege)retval;
}
///使用xml序列化
///using System.Xml.Serialization;
public RootPrivilege DeepCopy()
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer xml = new XmlSerializer(typeof(RootPrivilege));
//序列化成流
xml.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
//反序列化成对象
retval = xml.Deserialize(ms);
ms.Close();
}
return (RootPrivilege)retval;
}