C#单例模式

定义

确保一个类有且只有一个实例,并提供一个全局访问点。

 

UML类图

 

组成部分

  1. 定义一个类,允许客户端访问它的唯一实例
  2. 该类负责创建及维护自身唯一实例

 

代码部分

  1. 单例模式,单线程实现 
     1  /// <summary>
     2     /// 单例实体
     3     /// </summary>
     4     class Singleton
     5     {
     6         private static Singleton _instance = null;
     7  
     8         /// <summary>
     9         /// 控制器为protected
    10         /// </summary>
    11         protected Singleton() { }
    12  
    13         public static Singleton Instance()
    14         {
    15             //使用懒加载初始化
    16             //线程不安全
    17             if (_instance == null)
    18             {
    19                 _instance = new Singleton();
    20             }
    21             return _instance;
    22         }
    23     }

     以上代码在单线程情况下,线程安全。但是在多线程情况下,当多个线程同时访问Instance(),同时进行null判断时,就会进行多次实例化,这违背了单例模式的原则-一个类有且只有一个实例。

  2. 单例模式,多线程实现 
     1   /// <summary>
     2     /// 单例实体
     3     /// </summary>
     4     class Singleton
     5     {
     6         private static Singleton _instance = null;
     7  
     8         /// <summary>
     9         /// 控制器为protected
    10         /// </summary>
    11         protected Singleton() { }
    12  
    13         private static object lockHelper = new object();
    14  
    15         public static Singleton Instance()
    16         {
    17             //使用懒加载初始化
    18             //线程不安全
    19             if (_instance == null)
    20             {
    21                 lock (lockHelper)
    22                 {
    23                     if (_instance == null)
    24                     {
    25                         _instance = new Singleton();
    26                     }
    27                 }
    28             }
    29             return _instance;
    30         }
    31     }

     在多线程情况下,多加了一个锁的实现,进行了双重检索以防多次实例化。 

实际应用

     开发时会遇到饿汉模式与懒汉模式

  1. 饿汉式  
     1   class Singleton
     2     {
     3         private static Singleton _instance = new Singleton();
     4  
     5         protected Singleton() { }
     6  
     7         public static Singleton Instance()
     8         { 
     9             return _instance;
    10         }
    11     }

     饿汉式单例在类被加载时就进行了实例化,使用时响应速度快

  2. 懒汉式,同多线程下代码

    懒汉式单例在第一次使用时进行实例化,实现了延迟加载,节省了系统资源。

  (注:开发过程中,经常遇到一系列代码设计上的问题,希望运用常用的设计模式来解决。在接下来的时间里,通过运用设计模式来解决日常工作中的问题,总结经验提升自己,同时希望有志同道合的小伙伴一起探讨。文字如有不妥之处,望请指出。)

posted @ 2017-06-07 00:59  GodricV  阅读(195)  评论(0编辑  收藏  举报