淺談C++設(shè)計(jì)模式之單例模式
單例模式:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
通常我們可以讓一個(gè)全局變量使得一個(gè)對(duì)象被訪問,但它不能防止客戶實(shí)例化多個(gè)對(duì)象,一個(gè)***的辦法就是讓類自身負(fù)責(zé)保護(hù)它的唯一實(shí)例,這個(gè)類可以保證沒有其它實(shí)例可以被創(chuàng)建,并且它可以提供一個(gè)訪問該實(shí)例的方法。
單例模式因?yàn)镾ingleton類封裝它的唯一實(shí)例,這樣它可以嚴(yán)格控制客戶怎樣訪問它以及何時(shí)訪問它,簡(jiǎn)單地說就是對(duì)唯一實(shí)例的受控訪問。
實(shí)現(xiàn)原理:將構(gòu)造函數(shù)私有化,只提供一個(gè)靜態(tài)方法來創(chuàng)建一個(gè)對(duì)象。
(1) 將構(gòu)造函數(shù)設(shè)置成private;
(2) 聲明一個(gè)靜態(tài)的字段,初始化一個(gè)實(shí)例,返回Singleton對(duì)象;
(3) 用靜態(tài)方法或靜態(tài)屬性,返回那個(gè)唯一的實(shí)例
當(dāng)然,在對(duì)象用多線程時(shí),可能會(huì)造成創(chuàng)建多個(gè)實(shí)例,可以給創(chuàng)建對(duì)象的過程加鎖。
-
Singleton:定義一個(gè)Instance操作
- class Singleton{
- public:
- static Singleton* Instance();
- protected:
- Singleton(){}
- Singleton(const Singleton &instance){}
- Singleton& operator=(const Singleton &instance){}
- private:
- static Singleton* instance;
- };
- Singleton* Singleton::Instance(){
- if(instance == 0)
- instance = new Singleton;
- return instance;
- }
- Singleton* Singleton::instance = 0;
其實(shí),單例模式中最關(guān)鍵的就是把public的構(gòu)造函數(shù)私有化。這樣就把構(gòu)造對(duì)象的實(shí)例化的權(quán)利交給了類本身,讓Singleton來控制類的 實(shí)例化。當(dāng)然除了構(gòu)造函數(shù)之外,還需要把類的控制復(fù)制函數(shù)(拷貝構(gòu)造函數(shù),賦值運(yùn)算)私有化,因?yàn)榭蛻舳藳]有構(gòu)造的權(quán)利,所以也就沒有使用控制復(fù)制函數(shù)的 權(quán)利。