原型模式是创建型设计模式
原理是克隆一个对象:克隆对象不会走构造函数,速度更快
与单例模式不同的是,单例模式获得的同一个对象,原型模式获得是一个新的对象,如下图
在prototype类中添加引用类型的方法
再改变引用类的属性试试:改变student1的属性class中的属性,看看student2的属性的class的变化
结果student2的class属性也随着student1发生变化,说明它们的引用指向同一个地址
那为什么同为引用类型的string却没有发生变化呢??
1.看看以下的变动,改变赋值的方式,这样的赋值方式相当于赋值了新的对象,改变的是新对象的引用的值
2.所以string的赋值方式相当于
也是新对象,所以改变student1 不会改变 student2
3.所以MemberwiseClone 是浅克隆,克隆的只是对象的引用
深克隆
深克隆方法2,序列化,也能产生新的对象
1 public class SerializeHelper 2 { 3 public static string Serializable(object target) 4 { 5 using (MemoryStream stream = new MemoryStream()) 6 { 7 new BinaryFormatter().Serialize(stream, target); 8 9 return Convert.ToBase64String(stream.ToArray()); 10 } 11 } 12 13 public static T Derializable<T>(string target) 14 { 15 byte[] targetArray = Convert.FromBase64String(target); 16 17 using (MemoryStream stream = new MemoryStream(targetArray)) 18 { 19 return (T)(new BinaryFormatter().Deserialize(stream)); 20 } 21 } 22 23 public static T DeepClone<T>(T t) 24 { 25 return Derializable<T>(Serializable(t)); 26 } 27 }
**原型模式的应用
1.回滚操作,克隆一个对象回滚使用
2.克隆一个对象,看看更新后的对象哪些字段发生变化了
3.以一个实例为模板生产不同的对象出来,相当于一个生产工厂