設(shè)計(jì)模式- 單例模式

  • 單例模式:
    保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)预烙。
    為了解決兩個(gè)問(wèn)題:
    • 全局訪問(wèn)
    • 初始化控制
//簡(jiǎn)單單例
class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}
//客戶端代碼
static void Main(string[] args)
{   
    Singleton s1 = Singleton.GetInstance();
    Singleton s2 = Singleton.GetInstance();
    if(s1 == s2){
        Console.WriteLine("兩個(gè)對(duì)象是相同的實(shí)例");
    }
    Console.Read();
}
  • 多線程單例
    當(dāng)多個(gè)線程同時(shí)訪問(wèn) Singleton 類的時(shí)候酬屉,會(huì)有可能創(chuàng)建出多個(gè)實(shí)例负懦。這時(shí)就需要一把 lock 來(lái)確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不進(jìn)入臨界區(qū)。如果其他線程試圖進(jìn)入鎖定的代碼规肴,那么它將一直等待,直到該對(duì)象被釋放祭示。
//多線程單例
 class Singleton
 {
    private static Singleton instance;
    private static readonly object syncRoot = new object();
    private Singleton()
    {

    }
    //這樣做的缺點(diǎn)就是 每次創(chuàng)建的時(shí)候都需要 lock。
    // public static Singleton GetInstance()
    // {
    //  lock(syncRoot)
    //  {
    //      if(instance == null)
    //      {
    //          instance = new Singleton();
    //      }
    //  }
    //  return instance;
    // }
    //先判斷實(shí)例是否存在,不存在再加鎖處理
    public static Singleton GetInstance()
    {
        //判斷兩次實(shí)例是否為null 的道理在于,第一次判斷是為了避免頻繁加鎖
        /*第二次判斷是為了防止多線程多次創(chuàng)建實(shí)例當(dāng)多個(gè)線程同時(shí)訪問(wèn)的時(shí)候侧巨,會(huì)允許一個(gè)線程進(jìn)去,當(dāng)一個(gè)線程創(chuàng)建完對(duì)象之后贼陶,另一個(gè)線程進(jìn)入如果不判斷非空的情況,那么也會(huì)出現(xiàn)重復(fù)創(chuàng)建的情況巧娱。*/
        if(instance == null){
            lock(syncRoot){
                if(instance == null)
                {
                    instance = new Singleton();
                }
            }
        }   
        return instance;
    }
}
  • C# 靜態(tài)初始化
//這種靜態(tài)初始化方式是在自己被加載的時(shí)候就將自己實(shí)例化碉怔,上面的在第一次被引用的時(shí)候才會(huì)將自己實(shí)例化,屬于懶加載禁添。
public sealed class Singleton
{
    //在第一次引用類的任何成員時(shí)創(chuàng)建實(shí)例撮胧。公共語(yǔ)言運(yùn)行庫(kù)負(fù)責(zé)處理變量初始化
    private static readonly Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton GetInstance()
    {
        return instance;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市老翘,隨后出現(xiàn)的幾起案子芹啥,更是在濱河造成了極大的恐慌锻离,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓怀,死亡現(xiàn)場(chǎng)離奇詭異汽纠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)傀履,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門虱朵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人钓账,你說(shuō)我怎么就攤上這事碴犬。” “怎么了梆暮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵服协,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我啦粹,道長(zhǎng)偿荷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任卖陵,我火速辦了婚禮遭顶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泪蔫。我一直安慰自己棒旗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布撩荣。 她就那樣靜靜地躺著铣揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪餐曹。 梳的紋絲不亂的頭發(fā)上逛拱,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音台猴,去河邊找鬼朽合。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饱狂,可吹牛的內(nèi)容都是我干的曹步。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼休讳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讲婚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俊柔,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筹麸,失蹤者是張志新(化名)和其女友劉穎活合,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體物赶,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡白指,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了块差。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵续。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憨闰,靈堂內(nèi)的尸體忽然破棺而出状蜗,到底是詐尸還是另有隱情,我是刑警寧澤鹉动,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布轧坎,位于F島的核電站,受9級(jí)特大地震影響泽示,放射性物質(zhì)發(fā)生泄漏缸血。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一械筛、第九天 我趴在偏房一處隱蔽的房頂上張望捎泻。 院中可真熱鬧,春花似錦埋哟、人聲如沸笆豁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闯狱。三九已至,卻和暖如春抛计,著一層夾襖步出監(jiān)牢的瞬間哄孤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吹截, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘦陈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓波俄,卻偏偏與公主長(zhǎng)得像晨逝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弟断,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 單例模式(Singleton Pattern)是眾多設(shè)計(jì)模式中較為簡(jiǎn)單的一個(gè)咏花,同時(shí)它也是面試時(shí)經(jīng)常被提及的問(wèn)題趴生,如...
    廖少少閱讀 564評(píng)論 0 1
  • 前言 本文主要參考 那些年阀趴,我們一起寫過(guò)的“單例模式”昏翰。 何為單例模式? 顧名思義刘急,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,515評(píng)論 1 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法棚菊,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法叔汁,繼承相關(guān)的語(yǔ)法统求,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,643評(píng)論 18 399
  • 在Java設(shè)計(jì)模式中据块,單例模式相對(duì)來(lái)說(shuō)算是比較簡(jiǎn)單的一種構(gòu)建模式码邻。適用的場(chǎng)景在于:對(duì)于定義的一個(gè)類,在整個(gè)應(yīng)用程序...
    時(shí)待吾閱讀 248評(píng)論 0 0
  • 單例模式 單例模式有以下特點(diǎn): 單例類只能有一個(gè)實(shí)例 單例類必須自己創(chuàng)建自己的唯一實(shí)例 單例類必須給所有其他對(duì)象提...
    Mr_不靠譜_先森閱讀 362評(píng)論 0 0