原型模式(MemberwiseClone)

 

 

 

using System;

namespace 原型模式
{
    class Program
    {
        static void Main(string[] args)
        {
            // 使用静态构造对象(和单例相似)
            {
                System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                stopwatch.Start();

                Sample sample1 = Sample.CreateStaticSample();
                Sample sample2 = Sample.CreateStaticSample();
                sample1.Name = "3333";
                stopwatch.Stop();
                Console.WriteLine($"sample1:{sample1.Name}__sample2:{sample2.Name}__ 共经历时间{stopwatch.ElapsedMilliseconds}__ 注意:这里两个对象的值相同,都发生了改变,说明操作的是同一个对象");

            }
            {
                 // 使用原型模式构造对象
                // 监听执行时间
                System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                stopwatch.Start();
                Sample sample1 = Sample.CreateSample();
                Sample sample2 = Sample.CreateSample();
                sample1.Name = "44444444";  
                stopwatch.Stop();
                // 这里只有sample1 的值发生改变,说明sample1 和sample2 不是同一个对象
                Console.WriteLine($"sample1:{sample1.Name}__sample2:{sample2.Name}__ 共经历时间{stopwatch.ElapsedMilliseconds}——注意:这里的对象值发生了改变,说明创建了一个新的对象");

            }

            Console.ReadLine();
        }
    }


    public class Sample
    {

        private static Sample _sample = null;
        static Sample()
        {
            _sample = new Sample();
        }
        public static Sample CreateStaticSample()
        {
            return _sample;
        }
        public static Sample CreateSample()
        {
            
            // 直接拷贝一个对象,这里深拷贝,直接复制一个新的对象,如果该类里面有其他对象,只会拷贝其他对象的引用地址,不会创建新对象,比如该类
            return (Sample)_sample.MemberwiseClone();
        }
        public Sample()
        {
            for (var i = 0; i < 5; i++)
            {
                // 模拟进程休眠1秒
                System.Threading.Thread.Sleep(1000);
                this.Name = "制定项目管理计划";
                this.Age = 11;
                Console.WriteLine($"创建对象第{i}");
            }
        }
        public string Name { get; set; }

        public int Age { get; set; }
    }
}

 

 

posted @ 2020-04-12 22:21  谁说程序猿很猥琐  阅读(176)  评论(0编辑  收藏  举报