from:http://www.pconline.com.cn/pcedu/empolder/gj/c/0407/421424.html
ANSI C++ 中的 Singleton 實現說難不難,說容易也不容易,很多人寫 ANSI C++ 的 Singleton class 都有錯誤。這篇文章討論怎樣在 ANSI c++ 中寫 Singleton class, 希望對大家有幫助。
? 《設計模式》中把 Singleton 寫成返回指針:
| class Singleton{ public: ??? static Singleton* Instance(); protected: ??? Singleton(); private: ??? static Singleton* _instance; }; |
????? 相應的實現 cpp 文件是:
| Singleton* Singleton::_instance; Singleton* Singleton::Instance(){ ??? if( _instance == 0){ ??????? _instance = new Singleton; ??? }; ??? return _instance; } |
?
???
將構造函數設計成 protected 的目的是防止在 class 外面 new ,有人可能會設計成 private
,如果考慮到有可能會繼承這個類的話,還是將構造函數設計成 protected 比較好,還需要加一個 virtual 析構函數。為了防止別人復制
Singleton 對象:
| Singleton* pSingleton = Singleton::Instance(); Singleton s1 = *pSingleton; Singleton s2 = *pSingleton; 需要將拷貝構造(copy constructor)函數變成 private。 |
???
但是這里存在的問題是,什么時候刪除 Singleton 對象?按照 C++ 的一個基本原則,對象在哪里創建就在哪里銷毀,這里還應該放一個
destroy 方法來刪除 Singleton 對象。如果忘了刪除就比較麻煩。Instance 函數還存在多線程同時訪問的加鎖問題。如果把
Instance 函數開始和結尾放上加鎖和解鎖,整個函數性能會下降很多。這不是一個好的設計。
??? 有一個小小的改動,可以避免忘了刪除
Singleton 對象帶來內存泄露的問題。那就是用 std:auto_ptr 來包含 Singleton 對象,定義一個class
static member auto_ptr 對象,在析構的靜態 auto_ptr 變量的時候時候自動刪除 Singleton
對象。為了不讓用戶 delete Singleton 對象,需要將析構函數由 public 變成 protected。以下是頭文件
SingletonAutoPtr.h :
| #include <memory> using namespace std; class CSingletonAutoPtr { private: ??? static auto_ptr<CSingletonAutoPtr> m_auto_ptr; |