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玖院。