2 回答

TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊
singleton翻譯成單例,整個程序運行過程中只能存在這個類的一個對象。
實現(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)存比較大,或者程序里運用特別多的單例導(dǎo)致占用很多內(nèi)存,不建議用靜態(tài)存儲方式,因為靜態(tài)存儲區(qū)的大小是有限的。可能程序都運行不起來。
第三種寫起來稍微麻煩,還需要了解互斥鎖(多線程編程里會有講的),不過占用內(nèi)存較大也能運行!

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