原型模式
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); } } }
我们只需调用上面的类中的静态方法就可以实现对现有类的克隆了。所以对原型模式不是很感冒...
相关文章推荐
- 关系运算符,逻辑运算符
- java4Android(23):equals 的使用方法 instance 操作符【==与equals方法的区别】
- 内存管理器(四) 伙伴算法及分配器原理实现
- 《外商投资产业指导目录(2015年修订)》
- 内存管理器(四) 伙伴算法及分配器原理实现
- keil C51使用串口时程序跑死的问题
- Hibernate与数据库触发器协同工作
- ubuntu装gcc、g++、make等
- malloc/free与new/delete的区别
- eclipse+tomcat7解决项目中文乱码的一个思路
- 当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
- android简易跑马灯
- 生成passbook
- 触发器使Nhibernate更新操作时产生异常
- Stamps and Envelope Size
- C#使用指针表达式
- for循环
- python_5(list_列表)
- ALM工具的使用
- Eclipse建web项目问题