單例模式即一個(gè)類只擁有一個(gè)實(shí)例狂丝。
單例模式一
class MyClass{ private: MyClass(){} //構(gòu)造函數(shù)是私有的 MyClass(const MyClass &); //拷貝和復(fù)制都是私有的 MyClass& operator=(const MyClass &); public: ~MyClass(); static MyClass* Instance(); //無關(guān)的其他成員函數(shù)和變量 private: int m_iNum; public: int GetVal()const{return m_iNum;} };
//其中Instance()函數(shù)實(shí)現(xiàn) MyClass* MyClass::Instance(){ static MyClass instance; return &instance; }
因?yàn)闃?gòu)造函數(shù)是私有的,所以不能通過new來生成一個(gè)新的對(duì)象,也不能夠聲明一個(gè)對(duì)象。但是可以用靜態(tài)方法static MyClass* Instance(){static MyClass instance; return &instance;}
枚尼,這個(gè)方法聲明(在類的內(nèi)部赃绊,外部不能聲明)了一個(gè)靜態(tài)的MyClass對(duì)象岂昭,所有的對(duì)象共享一份豺总。所以只會(huì)有一個(gè)MyClass對(duì)象车伞。實(shí)現(xiàn)了單例模式。
單例模式二
通過判斷進(jìn)行單例模式
class MyClass{ private: MyClass(); ~MyClass(){} static int m_nHandleCount; //該單例對(duì)象引用次數(shù) static MyClass *m_pHandle; public: static MyClass* GetHandle(); void releaseHandle(); } //函數(shù)實(shí)現(xiàn) MyClass* MyClass::GetHandle(){ if(m_pHandle == NULL){ m_pHandle = new MyClass; if(m_pHandle != NULL){ m_nHandleCount++; return m_pHandle; } return NULL; //說明在new的時(shí)候出錯(cuò) }else{ m_nHandleCount++; return m_pHandle; } } //釋放 void MyClass::releaseHandle(){ if(m_nHandleCount > 0){ m_nHandleCount--; } if(m_nHandleCount == 0){ if(m_pHandle != NULL){ delete m_pHandle; m_pHandle = NULL; } } }
關(guān)鍵
這兩種方法實(shí)際上都是差不多
- 構(gòu)造函數(shù)要是私有的(包括復(fù)制構(gòu)造函數(shù)喻喳,和=重載)
- static的使用(第一種方法靜態(tài)對(duì)象另玖,第二種靜態(tài)指針)事實(shí)上是差不多的