2 回答

TA貢獻1942條經驗 獲得超3個贊
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函數之前進行構造的。變量存在靜態存儲區。
第二種特點是第一次用的時候構造,以后都返回它。變量存在靜態存儲區。
第三種特點是第一次用的時候構造,以后都返回它。變量存在堆內存中。
如果變量占用內存比較大,或者程序里運用特別多的單例導致占用很多內存,不建議用靜態存儲方式,因為靜態存儲區的大小是有限的??赡艹绦蚨歼\行不起來。
第三種寫起來稍微麻煩,還需要了解互斥鎖(多線程編程里會有講的),不過占用內存較大也能運行!

TA貢獻1816條經驗 獲得超4個贊
單例模式,在spring1..x中,當bean對象的singleton屬性為true時,意味著在spring的bean管理池中,只保持一個該bean對象的實例;當bean對象的singleton屬性為false時,意味著在spring的bean管理池中,為每一個針對該bean對象的請求都保持一個實例。
- 2 回答
- 0 關注
- 725 瀏覽
添加回答
舉報