1 回答

TA貢獻(xiàn)1790條經(jīng)驗 獲得超9個贊
singleton翻譯成單例,整個程序運(yùn)行過程中只能存在這個類的一個對象。
實現(xiàn)方式有三種。
第一種 - 全局靜態(tài)變量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: static Singleton instance; //靜態(tài)變量,全局只有這一個對象 Singleton() {} //構(gòu)造函數(shù)放在private里,讓外部無法構(gòu)造對象 Singleton(const Singleton&); //復(fù)制構(gòu)造函數(shù)放在private里,讓外部無法復(fù)制對象 Singleton& operator=(const Singleton&); //賦值函數(shù)放在private里,讓外部無法復(fù)制對象 public: Singleton& getInstance() { return instance; } };
Singleton Singleton::instance;//構(gòu)造一個靜態(tài)變量,作為全局唯一的對象。 |
第二種 - 局部靜態(tài)變量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: Singleton() {} //構(gòu)造函數(shù)放在private里,讓外部無法構(gòu)造對象 Singleton(const Singleton&); //復(fù)制構(gòu)造函數(shù)放在private里,讓外部無法復(fù)制對象 Singleton& operator=(const Singleton&); //賦值函數(shù)放在private里,讓外部無法復(fù)制對象 public: Singleton& getInstance() { static Singleton instance; //局部靜態(tài)變量,全局只有這一個對象 return instance; } }; |
第三種 - 第一次用的時候申請內(nèi)存,以后都直接用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Singleton { private: Singleton *instance; Singleton() {} //構(gòu)造函數(shù)放在private里,讓外部無法構(gòu)造對象 Singleton(const Singleton&); //復(fù)制構(gòu)造函數(shù)放在private里,讓外部無法復(fù)制對象 Singleton& operator=(const Singleton&); //賦值函數(shù)放在private里,讓外部無法復(fù)制對象 public: Singleton1* getInstance() { if (instance == NULL) { mutex_lock(); //并沒有這個函數(shù),我只是示意一下,表示互斥鎖 if (instance == NULL) { instance = new Singleton(); } mutex_release(); //釋放互斥鎖 } return instance; } }; |
第一種特點是程序加載時間長。因為靜態(tài)變量是在main函數(shù)之前進(jìn)行構(gòu)造的。變量存在靜態(tài)存儲區(qū)。
第二種特點是第一次用的時候構(gòu)造,以后都返回它。變量存在靜態(tài)存儲區(qū)。
第三種特點是第一次用的時候構(gòu)造,以后都返回它。變量存在堆內(nèi)存中。
如果變量占用內(nèi)存比較大,或者程序里運(yùn)用特別多的單例導(dǎo)致占用很多內(nèi)存,不建議用靜態(tài)存儲方式,因為靜態(tài)存儲區(qū)的大小是有限的。可能程序都運(yùn)行不起來。
- 1 回答
- 0 關(guān)注
- 595 瀏覽
添加回答
舉報