C#设计模式(单例模式)

单例模式(单线程和多线程)
单例模式的三种写法
单例模式的优缺点
深度探讨单例模式的应用场景
需求分析:
  1.对象在构造的时候会耗时间或者占用资源

  2.很多地方都需要用到这个对象
  3.不同的地方使用一个实例和多个实例没有区别
综上所述:对象重用,不需要重复构造
解析:
  一、构造函数私有化----避免重复构造

  二、公开静态方法提供实例----这样才能提供外部访问
  三、静态变量共享----保证全局变量的唯一性
思考:单线程与多线程的区别,考虑并发性
解决方案:加锁,但是要考虑性能优化(因为重复加锁会影响性能),加判断

优点

(1) 由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了

(2) 由于单例模式只生成一个实例,所以,减少系统的性能开销,当一个对象产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

(3) 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作

(4) 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

缺点

(1) 单例模式没有抽象层,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

(2) 单例类的职责过重,在一定程度上违背了“单一职责原则”。

(3) 滥用单例将带来一些负面问题,如:为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;

又比如:在多个线程中操作单例类的成员时,但单例中并没有对该成员进行线程互斥处理。



#region 懒汉式
        public static Singleton Instance = null;
        private static readonly object _padLock = new object();
        public static Singleton CreateInstance()
        {
            if (Instance == null)
            {
                lock (_padLock)//保证方法块儿只有一个线程可以进入
                {
                    Console.WriteLine("进入lock排队....");
                    Thread.Sleep(1000);
                    if (Instance == null)
                    {
                        Instance = new Singleton();
                    }
                }
            }
            return Instance;
        }   
#endregion

  

#region 饿汉式1
        public static SingletonSecond Instance = null;
        /// <summary>
        /// 静态构造函数:由CLR保证,在第一次使用到这个类型之前,自动被调用且只调用一次
        /// 很多初始化都可以写在这里
        /// </summary>
        static SingletonSecond()
        {
            Instance = new SingletonSecond();
        }
        public static SingletonSecond CreateInstance()
        {
            return Instance;
        }
#endregion

  

#region饿汉式2
   /// <summary>
       /// 静态构造函数:由CLR保证,在第一次使用到这个类型之前,会自动初始化且只会初始化一次
        private static SingletonThird Instance = new SingletonThird();
        public static SingletonThird CreateInstance()
        {
            return Instance;
        }
#endregion

  

 
posted @ 2021-01-02 11:16  oliverary  阅读(266)  评论(0)    收藏  举报