1 回答

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