示例#1
0
        /*
         * 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。--《设计模式》Gof
         *
         * 模式的组成
         *
         *  (1)原型类(Prototype):原型类,声明一个Clone自身的接口; 如:[Prototype]
         *
         *            (2)具体原型类(ConcretePrototype):实现一个Clone自身的操作。 如:[MonkeyKing]
         *
         *             在原型模式中,Prototype通常提供一个包含Clone方法的接口,具体的原型ConcretePrototype使用Clone方法完成对象的创建。
         *
         */
        static void Main(string[] args)
        {
            Master master = new Master("唐僧");

            Prototype zhenshen = new MonkeyKing("孙悟空", master);

            var fenshen1 = zhenshen.Clone();

            fenshen1.Name = "分身1";

            var fenshen2 = zhenshen.Clone();

            fenshen2.Name = "分身2";

            Console.WriteLine($"真身:{zhenshen.Name}");
            Console.WriteLine($"分身:{fenshen1.Name}");
            Console.WriteLine($"分身:{fenshen2.Name}");

            Console.WriteLine($"真身和分身1的师傅:{((MonkeyKing) zhenshen).Master == (fenshen1 as MonkeyKing)?.Master}");
            Console.WriteLine($"真身和分身2的师傅:{((MonkeyKing) zhenshen).Master == (fenshen2 as MonkeyKing)?.Master}");

            Console.ReadKey();

            /*
             * 总结:
             * 1.原型模式其实就是克隆对象吧,节省对象的开销,别的没什么东西,之所以叫原型,是因为其他对象都是以这个为原型来的,好像有参照的味道一样。
             * 2.此例中的克隆是浅拷贝,即值类型复制过去,引用类型还是引用的同一个对象,所以分身的师傅们都是一样的。
             * 3.也可以作成深拷贝,所有的属性都不是同一个,这样克隆出来的对象还可以做稍微的修改而不影响本来对象。
             *
             * 中心思想:当我们有需要大量的同类对象时,我们就可以用原型模式(暂且也叫克隆模式吧),这样克隆出来的对象的很多属性就不用自己一个一个复制了,还节省了开销。
             */
        }
示例#2
0
        static void Main(string[] args)
        {
            //原型对象
            MonkeyKingPrototype monkeyKingPrototype = new MonkeyKing("孙悟空");

            monkeyKingPrototype.Teacher = new Teacher()
            {
                Name = "唐僧"
            };
            //变一个
            MonkeyKingPrototype monkeyKing1 = monkeyKingPrototype.Clone();

            Console.WriteLine(string.Format("名字:{0},师傅:{1}", monkeyKing1.Name, monkeyKing1.Teacher.Name));
            //第一个孙悟空的师傅是菩提祖师
            monkeyKing1.Teacher.Name = "菩提祖师";
            //再变一个
            MonkeyKingPrototype monkeyKing2 = monkeyKingPrototype.Clone();

            Console.WriteLine(string.Format("名字:{0},师傅:{1}", monkeyKing2.Name, monkeyKing2.Teacher.Name));
            Console.ReadKey();
        }