`

单例模式

 
阅读更多

 

  • 在应用程序的整个生命周期中,类的实例只能存在一个,或者0个。
  • 在这个单例类中,该类的构造函数是private的,还有一个GetInstance的方法,用于获取该类实例。
  • 单例模式分为两种:懒汉单例和饿汉单例;
  • 懒汉单例:不会自己实例化,只有自己去new,这里就要考虑到一个线程安全的问题了,应用lock来防止两个同步线程创建两个实例,应用double check来维持只有一个实例的创建和减少每次都调用lock导致性能损耗
  •  

public class Singleton 
    { 
        //定义一个私有的静态全局变量来保存该类的唯一实例 
        private static Singleton singleton;

        //定义一个只读静态对象 
        //且这个对象是在程序运行时创建的
 
        private static readonly object syncObject = new object();

        /// <summary> 
        /// 构造函数必须是私有的 
        /// 这样在外部便无法使用 new 来创建该类的实例 
        /// </summary>
 
       private Singleton() 
        {

        }

       /// <summary> 
        /// 定义一个全局访问点 
        /// 设置为静态方法 
        /// 则在类的外部便无需实例化就可以调用该方法 
        /// </summary> 
        /// <returns></returns>
 
        public static Singleton GetInstance() 
        { 
         
   //这里可以保证只实例化一次 
            //即在第一次调用时实例化 
            //以后调用便不会再实例化
 

            //第一重 singleton == null 
            if (singleton == null
            { 
                
lock (syncObject) 
                {

                            //第二重 singleton == null

                    if (singleton == null
                    { 
                        singleton = new Singleton(); 
                    }
 
                } 
            } 
            return singleton; 

    • 饿汉单例:不需要考虑线程问题,因为他先new 个实例出来,并用static readonly修饰,这样已经足以维持该实例的唯一性了
    • public sealed class Singleton 
          { 
              private static readonly Singleton singleton = new Singleton();

              private Singleton() 
              { 
              }

              public static Singleton GetInstance() 
              { 
                  return singleton
              } 
          } 

    分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics