23设计模式 创建型


1 单例    SinglePattern  整个程序只有一个实力  保证程序中只有一个实例被创建 

   (线程池,数据库连接池 ,配置文件对象,Ioc容器实例 等程序中只需要一个实例的过程,单例是常驻内存)

2 工厂方法   Method Factory

3 抽象工厂  Abstrac Factory

4 建造者  Builder       是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,创建者模式隐藏了复杂对象的创建过程。

5 原型   Protype

6 简单工厂   simple Factory

                                单例   SinglePattern

懒汉式   private Singleton()
        {
            long lResult = 0;
            for (int i = 0; i < 10000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次 {Thread.CurrentThread.ManagedThreadId}");
        }
        private static Singleton _Singleton = null;
        private static readonly object Singleton_Lock = new object();
        public static Singleton CreateInstance()
        {
            if (_Singleton == null)//为了提升性能,对象初始化之后能够并发
            {
                lock (Singleton_Lock)//保证任意时刻只有一个线程可以进入
                {
                    if (_Singleton == null)//里面的也不能去掉,因为在最开始并发时需要控制的,仅仅用于第一次初始化时的并发判断,防止重复初始化
                    {
                        _Singleton = new Singleton();
                    }
                }
            }
            return _Singleton;
        }
饿汉式  private SingletonSecond()
        {
            long lResult = 0;
            for (int i = 0; i < 10000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次 {Thread.CurrentThread.ManagedThreadId}");
        }
        /// 
        /// 由CLR调用,且只调用一次,会在程序第一次使用该类型之前
        /// 
        static SingletonSecond()
        {
            _SingletonSecond = new SingletonSecond();
        }
        private static SingletonSecond _SingletonSecond = null;
        public static SingletonSecond CreateInstance()
        {
            return _SingletonSecond;
        }
饿汉式   private SingletonThird()
        {
            long lResult = 0;
            for (int i = 0; i < 10000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次 {Thread.CurrentThread.ManagedThreadId}");
        }
        /// 
        /// 静态字段也是由CLR保障的,在程序第一次使用该类型之前,完成初始化,且只初始化一次
        /// 
        /// 静态字段          1先执行
        /// 静态构造函数     2后执行
        /// 谁先执行
        /// 
        private static SingletonThird _SingletonThird = new SingletonThird();
        public static SingletonThird CreateInstance()
        {
            return _SingletonThird;
        }
     public static Donoting()
      {
   // 调用 Donoting() 的静态方法  
  // 会先初始化静态字段->静态构造函数-> 这样迫不及待的调用叫饿汉
      }
                //类里面各个元素的初始化顺序
                //静态字段1--静态构造函数2--普通属性---构造函数3--普通字段
        Program program = new Program();
            //    //开辟内存空间         a
            //    //执行构造函数         b
            //    //引用地址绑定给变量   c
            //克隆就少了第二步

                                                                                                    原型  SingleProtope    

//内存复制---浅克隆 内存克隆开辟新的空间指向栈中同一个地方 ,栈中的并没有改变
//解决了单例对象覆盖问题,通过内存拷贝
//单例的话会相互覆盖 新的覆盖旧的
//1 一般情况下,我们构造函数也不折腾。。。
//2 new习惯了,习惯也是一种力量,
//3 原型模式也有个常驻内存的东西
//4 IOC不能玩,构造函数的初始化也失效了
//5克隆其实就是绕开内存

private SingletonPrototype()浅克隆
        {
            long lResult = 0;
            for (int i = 0; i < 10000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次 {Thread.CurrentThread.ManagedThreadId}");
        }

        private static SingletonPrototype _SingletonPrototype = new SingletonPrototype();
        /// 
        /// 原型模式
        /// 
        /// 
        public static SingletonPrototype CreateInstance()
        {
           SingletonPrototype instance = (SingletonPrototype)_SingletonPrototype.MemberwiseClone();
       return instance;
     }
  {
                SingletonPrototype singleton1 = SingletonPrototype.CreateInstance();
                SingletonPrototype singleton2 = SingletonPrototype.CreateInstance();

                singleton1.Id = 123;
                singleton1.Name = "金辰";

                singleton2.Id = 234;
                singleton2.Name = "大浪";

                //代码这样写,会不会有什么问题,或者出现什么意料之外的事儿?
                //覆盖--因为单例,是同一个对象,操作就互相覆盖了,以后面的为准

                //单例可以避免重复初始化对象(构造函数浪费时间)---但是对象覆盖了---
                //有没有办法兼得?
            }
     // 深克隆
   public static string Serializable(object target) { using (MemoryStream stream = new MemoryStream()) { new BinaryFormatter().Serialize(stream, target); return Convert.ToBase64String(stream.ToArray()); } }
public static T Derializable(string target) { byte[] targetArray = Convert.FromBase64String(target); using (MemoryStream stream = new MemoryStream(targetArray)) { return (T)(new BinaryFormatter().Deserialize(stream)); } } public static T DeepClone(T t) { return Derializable(Serializable(t)); }

创建对象的方法    

1new

2克隆

3反序列化

4反射