通过拷贝创建新的对象
ColorPrototype是颜色基类(抽象类),ConcteteColorPrototype是具体的父类,他包括两个方法Clone和DeepClone,那就介绍下Clone和DeepClone的区别
Clone: 又叫浅拷贝,MemberwiseClone(),这只能拷贝一层,如果某个属性是引用类型,无法进行真正的拷贝。
DeepClone:是从对象表面到最底端,进行拷贝,是一种完全拷贝。
namespace 大话设计模式 { [Serializable] public abstract class ColorPrototype { /// <summary> /// 克隆 /// </summary> /// <returns></returns> public abstract ColorPrototype Clone(); /// <summary> /// 深度克隆 /// </summary> /// <returns></returns> public abstract ColorPrototype DeepClone(); } }
public class ColorManager { private Hashtable colors = new Hashtable(); /// <summary> /// 结构 /// </summary> /// <param name="name"></param> /// <returns></returns> public ColorPrototype this[string name] { get { return (ColorPrototype)colors[name]; } set { colors.Add(name, value); } } }
namespace 大话设计模式 { [Serializable] public class ConcteteColorPrototype : ColorPrototype { public int red; public int green; public int blue; public Student Student=new Student(){Name = "张三"}; public ConcteteColorPrototype(int red, int green, int blue) { this.red = red; this.green = green; this.blue = blue; } /// <summary> /// 克隆 /// </summary> /// <returns></returns> public override ColorPrototype Clone() { return (ConcteteColorPrototype)this.MemberwiseClone(); } public override ColorPrototype DeepClone() { MemoryStream memoryStream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(memoryStream, this); memoryStream.Position = 0; var colorPrototype = (ColorPrototype)formatter.Deserialize(memoryStream); return colorPrototype; } } [Serializable] public class Student { public string Name { get; set; } } }