C#_單例模式


單例:在程序的整個進程中只會被實例化一次

如:User user =new User();實例化一個User();的時候new User()是調用的 User類的 默認的公有構造函數:public User(){};

一.想要整個程序只實例化一次這個User的話如:

1.private static User_user=null; 定義一個私有的靜態變量

2.提供靜態公有方法返回實例化對象

public static GetUser(){ 
          if(User_user==null)
            {
                User_user=new User();
            }
            return User_user;
        }

3.調用:User user =User.GetUser();//進行返回單個實例

4.多線程的時候需要加一把鎖:

  private static object _lock =new object();//定義一個靜態的對象最好是object類型
        public static GetUser(){ 
            if (User_user==null)
            {
              lock (_lock)
                {
                  if(User_user==null)
                    {
                        User_user=new User();
                    }
                }
            }
            return User_user;
        }
加鎖進行多線程判斷

 

二.想要整個程序只實例化一次這個User的話如:

 private static User User_user =null;//提供私有靜態實例對象
        static   User()//CLR運行的時候,第一次使用這個類之前,一定會而且只執行一次
        {
            User_user =new User();
        }
        public static GetUser()//提供公有靜態方法供外部調用
        {
            return User_user;
        }

 

//雙重鎖機制

namespace Singleton
{
    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;
        }
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM