單例模式:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。多線程
一般咱們能夠讓一個全局變量使得一個對象被訪問,但它不能防止客戶實例化多個對象,一個最好的辦法就是讓類自身負責保護它的惟一實例,這個類能夠保證沒有其它實例能夠被建立,而且它能夠提供一個訪問該實例的方法。函數
單例模式由於Singleton類封裝它的惟一實例,這樣它能夠嚴格控制客戶怎樣訪問它以及什麼時候訪問它,簡單地說就是對惟一實例的受控訪問。spa
實現原理:將構造函數私有化,只提供一個靜態方法來建立一個對象。線程
(1) 將構造函數設置成private;code
(2) 聲明一個靜態的字段,初始化一個實例,返回Singleton對象;對象
(3) 用靜態方法或靜態屬性,返回那個惟一的實例blog
固然,在對象用多線程時,可能會形成建立多個實例,能夠給建立對象的過程加鎖。class
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來控制類的實例化。固然除了構造函數以外,還須要把類的控制複製函數(拷貝構造函數,賦值運算)私有化,由於客戶端沒有構造的權利,因此也就沒有使用控制複製函數的權利。變量
版權全部,歡迎轉載,轉載請註明出處!原理