示例#1
0
        static void Main(string[] args)
        {
            Console.WriteLine(@"在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,
            如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,
            因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,
            随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,
            然而原型模式可以很好地解决这个问题,因为每个类实例都是相同的,当我们需要多个相同的类实例时,
            没必要每次都使用new运算符去创建相同的类实例对象,此时我们一般思路就是想——只创建一个类实例对象,
            如果后面需要更多这样的实例,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,
            从而减少内存的消耗和达到类实例的复用。 然而这个思路正是原型模式的实现方式。");
            Console.WriteLine("===========================================================================");


            MonkeyKingPrototype monkey = new MonkeyKing2("美猴王");

            MonkeyKingPrototype monkey1 = monkey.Clone();

            Console.WriteLine("Cloned1:\t" + monkey1.ID);

            MonkeyKingPrototype monkey2 = monkey.Clone();

            Console.WriteLine("Cloned2:\t" + monkey2.ID);


            Console.Read();
        }
示例#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();
        }
示例#3
0
        static void Main(string[] args)
        {
            MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing");

            // 变一个
            MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype;

            if (cloneMonkeyKing != null)
            {
                Console.WriteLine("Cloned1:\t" + cloneMonkeyKing.Id);
            }

            // 变两个
            MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype;

            if (cloneMonkeyKing2 != null)
            {
                Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id);
            }
            Console.ReadLine();
        }