您的位置:首页 > 其它

原型模式

2015-10-17 22:36 295 查看

定义

通过实现对象可以复制自身,已现有自身对象为基础克隆出新对象,再在新对象上进行修改得到我们想要的实例。其本质为克隆,快速创建对象。

类图



代码

public class ProtoSubject : ICloneable
{

public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
/// <summary>
/// 克隆(克隆的话,一般设为深复制)
/// </summary>
/// <returns></returns>
public object Clone()
{
using (Stream s = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, this);
s.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(s);
}
}
/// <summary>
/// 浅复制
/// </summary>
/// <returns></returns>
public object ShadowClone()
{
return this.MemberwiseClone();
}
}

public class Client
{
public void TestProtoType()
{
ProtoSubject subject = new ProtoSubject()
{
Property1 = "00001",
Property2 = "00002",
Property3 = "009",
};
//当现在需要一个和subject一样的对象,只是property3为“hello world”时,我们难道要重新见一个对象并重新使用初赋值语句?
//而ProtoSubject已经有自身的克隆功能了,我们只需克隆一个新对象,并将需改变的属性设成我们要设置的值就可以了。
ProtoSubject subject2 = (ProtoSubject)subject.Clone();
}
}


总结

其实这个模式非常简单,也有有些所谓的建议:类都应该实现自身的克隆方法。

但也不是这样的,自身的克隆现在基本上不用,而是通过第三方帮助类来实现,例如:

public class CloneHelper<T> where T:class
{
public static T Clone(T t)
{
using (Stream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, t);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
}


我们只需调用上面的类中的静态方法就可以实现对现有类的克隆了。所以对原型模式不是很感冒...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: