淺談C++設(shè)計(jì)模式之單例模式
單例模式:保證一個類僅有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)。
通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止客戶實(shí)例化多個對象,一個***的辦法就是讓類自身負(fù)責(zé)保護(hù)它的唯一實(shí)例,這個類可以保證沒有其它實(shí)例可以被創(chuàng)建,并且它可以提供一個訪問該實(shí)例的方法。
單例模式因?yàn)镾ingleton類封裝它的唯一實(shí)例,這樣它可以嚴(yán)格控制客戶怎樣訪問它以及何時訪問它,簡單地說就是對唯一實(shí)例的受控訪問。
實(shí)現(xiàn)原理:將構(gòu)造函數(shù)私有化,只提供一個靜態(tài)方法來創(chuàng)建一個對象。
(1) 將構(gòu)造函數(shù)設(shè)置成private;
(2) 聲明一個靜態(tài)的字段,初始化一個實(shí)例,返回Singleton對象;
(3) 用靜態(tài)方法或靜態(tài)屬性,返回那個唯一的實(shí)例
當(dāng)然,在對象用多線程時,可能會造成創(chuàng)建多個實(shí)例,可以給創(chuàng)建對象的過程加鎖。
-
Singleton:定義一個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)造對象的實(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)利。