什么時候該用Singleton事示?

0.前言

今天做筆試遇到一個問答題,問簡述一種設(shè)計模式的用法疏旨。鄙人才疏學淺很魂,設(shè)計模式之類的高大上存在一直都是沒怎么研究過,唯一一個用過的就是一個被眾人唾棄的單例模式檐涝,不過要具體闡述單例模式怎么用遏匆,我只想到用于管理數(shù)據(jù)或者通用方法的類中使用。所以說一交卷就立馬stack overflow了一波谁榜,下面總結(jié)一下幅聘。

1.一個簡單的Singleton實現(xiàn)

之前實習的時候發(fā)現(xiàn)公司里面好多代碼都有singleton,他們是這樣實現(xiàn)的:

class singleton {
public:
    static singleton* Instance();
private:
    static singleton* instance_;
};
//singleton.cpp
singleton* singleton::instance_ = nullptr;
singleton* singleton::Instance() {
    if (!instance_) {
        instance_ = new singleton();
    }
    return instance_;
}

顯然這是這里面內(nèi)存泄露了窃植,如果稍微改進一下帝蒿,那么加個release方法來釋放內(nèi)存。其實完全不用這么麻煩巷怜,現(xiàn)代C++的singleton應(yīng)該如下定義:

class testSingleton{
    public:
    ~testSingleton(){}
    testSingleton& operator=(const testSingleton& other)=delete;
    testSingleton(const testSingleton& other)=delete;
    static testSingleton& Instance(){
        static testSingleton instance;
        return instance;
    }
    private:
    testSingleton(){}
};

1.為什么眾高手紛紛唾棄Singleton

在看了幾個高手的答案后葛超,我發(fā)現(xiàn)他們其實并沒有唾棄Singleton,而是在唾棄global state延塑,為什么不直接唾棄global state而要繞個圈子去唾棄無辜的Singleton呢绣张?很簡單,因為大家都唾棄global state关带,你再唾棄就沒人理你了侥涵,肯定要另辟蹊徑才能讓我們這些novice震驚不是。

2.使用Singleton(global)的壞處

1.因為單例代表著全局宋雏,而全局變量是transitive的芜飘,假設(shè)這樣一個應(yīng)用場景:我有個全局變量A,本來我寫代碼是設(shè)想A在我調(diào)用函數(shù)里使這個用時值為B磨总,但是這個全局變量在另一個線程里被改成了C嗦明,結(jié)果就不對了。如果你的應(yīng)用是單線程的話蚪燕,那是不是也沒什么事招狸,當然這只是我的猜測。
2.使用單例會讓代碼變得難以閱讀邻薯,這是對于維護者而言的

3.什么時候可以用SIngleton

1.根據(jù)上面所說,如果你的全局變量是immutable的乘凸,那么你使用單例來組織一下這些變量也沒什么問題厕诡,因為其他代碼不會改變他的值,只有它可以影響其他代碼的執(zhí)行营勤,這是單向的灵嫌。
2.如果你的單例產(chǎn)生的代碼對于程序運行沒有影響壹罚,那么你也可以使用Singleton,例如logger寿羞,你去掉它程序照跑猖凛,不會影響結(jié)果。

4.總結(jié)

其實高手們還說了不少绪穆,但是我功力不夠都沒怎么看懂辨泳,但是以上幾點確實說的很有道理,以后再研究一下如何避免使用Singleton玖院。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菠红,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子难菌,更是在濱河造成了極大的恐慌试溯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊酒,死亡現(xiàn)場離奇詭異遇绞,居然都是意外死亡,警方通過查閱死者的電腦和手機燎窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門摹闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荠耽,你說我怎么就攤上這事钩骇。” “怎么了铝量?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵倘屹,是天一觀的道長。 經(jīng)常有香客問我慢叨,道長纽匙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任拍谐,我火速辦了婚禮烛缔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轩拨。我一直安慰自己践瓷,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布亡蓉。 她就那樣靜靜地躺著晕翠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淋肾,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天硫麻,我揣著相機與錄音,去河邊找鬼樊卓。 笑死拿愧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碌尔。 我是一名探鬼主播浇辜,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼七扰!你這毒婦竟也來了奢赂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤颈走,失蹤者是張志新(化名)和其女友劉穎膳灶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體立由,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡轧钓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锐膜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕箍。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖道盏,靈堂內(nèi)的尸體忽然破棺而出而柑,到底是詐尸還是另有隱情,我是刑警寧澤荷逞,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布媒咳,位于F島的核電站,受9級特大地震影響种远,放射性物質(zhì)發(fā)生泄漏涩澡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一坠敷、第九天 我趴在偏房一處隱蔽的房頂上張望妙同。 院中可真熱鬧,春花似錦膝迎、人聲如沸粥帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒涡。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拖陆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工懊亡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留依啰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓店枣,卻偏偏與公主長得像速警,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸯两,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,740評論 0 38
  • 不足的地方請大家多多指正闷旧,如有其它沒有想到的常問面試題請大家多多評論,一起成長钧唐,感謝!~ String可以被繼承嗎...
    啟示錄是真的閱讀 2,920評論 3 3
  • 踏云穿月迫切歸 山凄水寒已無魂 他鄉(xiāng)漂泊居無定 東門桑柏掩新墳 游子思鄉(xiāng)忙灼,亙古不變,情難自已钝侠,歷久彌新该园。有...
    小小貓仔大大貓媽閱讀 418評論 2 11
  • 我小時候上學,每天都要步行帅韧。從村子的這頭走到村子的那頭里初;從村子的那頭到田野的這頭,從田野的這頭走到田野...
    素聞詩書閱讀 351評論 0 1