所謂單例模式购披,就是只允許全局有一個(gè)此類生成的對(duì)象芹敌。在C++中有幾種實(shí)現(xiàn)痊远,下面一一列舉。
1. 最初模式
class Singleton {
public:
static Singleton * GetInstance() {
if(m_pInstance==NULL)
m_pInstance=new Singleton();
return m_pInstance;
}
private:
static Singleton *m_pInstance;
Singleton();
Singleton & operator=(Singleton& s);
Singleton(Singleton& s);
}
需要解釋的幾點(diǎn):
- 必須把構(gòu)造函數(shù)氏捞、賦值運(yùn)算碧聪、拷貝構(gòu)造函數(shù)設(shè)為私有,這是防止單例在外部被復(fù)制液茎;
- 使用static成員逞姿,保證全局只有一份。
有些朋友說(shuō)這里單例需要被釋放的問題捆等。其實(shí)這是個(gè)偽問題滞造,不存在,單例一旦被創(chuàng)建就會(huì)活到整個(gè)程序結(jié)束栋烤。當(dāng)程序結(jié)束時(shí)谒养,程序占用的堆(單例被new的地方)也會(huì)應(yīng)被操作系統(tǒng)自動(dòng)釋放,程序結(jié)束后明郭,不會(huì)遺留任何問題买窟,所以不必?fù)?dān)心空間的釋放問題。
2. 局部靜態(tài)變量實(shí)現(xiàn)
可以使用局部的靜態(tài)變量來(lái)實(shí)現(xiàn)薯定,看代碼干凈整潔了許多始绍。
class Singleton {
public:
static Singleton & GetInstance() {
static Singleton obj
return obj;
}
private:
Singleton();
Singleton & operator=(Singleton& s);
Singleton(const Singleton& s);
}