static public PrototypeClass getInstance() { ///浅克隆,值对象克隆新的地址,引用对象克隆引用地址,不会克隆引用对象本身 PrototypeClass prototypeClass = (PrototypeClass)_prototypeClass.MemberwiseClone(); return(prototypeClass); }
static public PrototypeClass getInsDeep() { ///浅克隆,值对象克隆新的地址,引用对象克隆引用地址,不会克隆引用对象本身 PrototypeClass prototypeClass = (PrototypeClass)_prototypeClass.MemberwiseClone(); ///手动深克隆,class是引用,克隆只克隆了地址 prototypeClass.inside = new ClassInside(); return(prototypeClass); }
static void Main(string[] args) { { Console.WriteLine("-------------- 浅克隆 ---------------"); PrototypeClass prototypeClass1 = PrototypeClass.getInstance(); PrototypeClass prototypeClass2 = PrototypeClass.getInstance(); prototypeClass1.ID = 5; prototypeClass1.inside.CID = 10; prototypeClass1.inside.name = "jimmy"; Console.WriteLine($"{prototypeClass1.ID}, {prototypeClass1.inside.CID}, {prototypeClass1.inside.name}"); Console.WriteLine($"{prototypeClass2.ID}, {prototypeClass2.inside.CID}, {prototypeClass2.inside.name}"); } { Console.WriteLine("-------------- 手动深克隆 ---------------"); PrototypeClass prototypeClass1 = PrototypeClass.getInsDeep(); PrototypeClass prototypeClass2 = PrototypeClass.getInsDeep(); prototypeClass1.ID = 5; prototypeClass1.inside.CID = 10; prototypeClass1.inside.name = "jimmy"; Console.WriteLine($"{prototypeClass1.ID}, {prototypeClass1.inside.CID}, {prototypeClass1.inside.name}"); Console.WriteLine($"{prototypeClass2.ID}, {prototypeClass2.inside.CID}, {prototypeClass2.inside.name}"); } { Console.WriteLine("-------------- 序列化深克隆 ---------------"); PrototypeClass prototypeClass1 = PrototypeClass.getInsSerial(); PrototypeClass prototypeClass2 = PrototypeClass.getInsSerial(); prototypeClass1.ID = 5; prototypeClass1.inside.CID = 10; prototypeClass1.inside.name = "jimmy"; Console.WriteLine($"{prototypeClass1.ID}, {prototypeClass1.inside.CID}, {prototypeClass1.inside.name}"); Console.WriteLine($"{prototypeClass2.ID}, {prototypeClass2.inside.CID}, {prototypeClass2.inside.name}"); } Console.ReadLine(); }
/// <summary> /// 单例模式一 : 静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次 /// </summary> static PrototypeClass() { _prototypeClass = new PrototypeClass(); }