單例模式:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止客戶實例化多個對象,一個最好的辦法就是讓類自身負責保護它的唯一實例,這個類可以保證沒有其它實例可以被創建,並且它可以提供一個訪問該實例的方法。
單例模式因為Singleton類封裝它的唯一實例,這樣它可以嚴格控制客戶怎樣訪問它以及何時訪問它,簡單地說就是對唯一實例的受控訪問。
實現原理:將構造函數私有化,只提供一個靜態方法來創建一個對象。
(1) 將構造函數設置成private;
(2) 聲明一個靜態的字段,初始化一個實例,返回Singleton對象;
(3) 用靜態方法或靜態屬性,返回那個唯一的實例
當然,在對象用多線程時,可能會造成創建多個實例,可以給創建對象的過程加鎖。
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;
其實,單例模式中最關鍵的就是把public的構造函數私有化。這樣就把構造對象的實例化的權利交給了類本身,讓Singleton來控制類的 實例化。當然除了構造函數之外,還需要把類的控制復制函數拷貝構造函數,賦值運算)私有化,因為客戶端沒有構造的權利,所以也就沒有使用控制復制函數的 權利。