C++設計模式-單例的實現以及使用場景
模式
在一定環境中解決某一問題的方案,包括三個基本元素--問題,解決方案和環境。
大白話:在一定環境下,用固定套路解決問題。
設計模式(Design pattern)
是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使程式碼編制真正工程化。
單利模式應該用場景:
核心作用:保證一個類只有一個例項,並且提供一個訪問該例項的全域性訪問點
應該在什麼時候下使用單例模式?
舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次開啟一個新的回收站時,Windows系統並不會為你彈出一個新的回收站視窗。,也就是說在整個系統執行的過程中,系統只維護一個回收站的例項。這就是一個典型的單例模式運用。
繼續說回收站,我們在實際使用中並不存在需要同時開啟兩個回收站視窗的必要性。假如我每次建立回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複建立該例項的情況下,建立了多個例項,這樣做就會給系統造成不必要的負擔,造成資源浪費。
再舉一個例子,網站的計數器,一般也是採用單例模式實現,如果你存在多個計數器,每一個使用者的訪問都重新整理計數器的值,這樣的話你的實計數的值是難以同步的。但是如果採用單例模式實現就不會存在這樣的問題,而且還可以避免執行緒安全問題。同樣多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池需要方便對池中的執行緒進行控制
同樣,對於一些應用程式的日誌應用,或者web開發中讀取配置檔案都適合使用單例模式,如HttpApplication 就是單例的典型應用。
從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點:
適用場景: 1.需要生成唯一序列的環境
2.需要頻繁例項化然後銷燬的物件。
3.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。
4.方便資源相互通訊的環境
程式碼實現
#include <iostream> using namespace std; /* a) 建構函式私有化 b) 提供一個全域性的靜態方法(全域性訪問點) c) 在類中定義一個靜態指標,指向本類的變數的靜態變數指標 */ class Singelton { private: Singelton() { cout << "Singelton 建構函式" << endl; } public: static Singelton *getInstance() { if (p_Singel == NULL) { p_Singel = new Singelton; } return p_Singel; } static void freeInstance() { if (p_Singel != NULL) { delete p_Singel; p_Singel = NULL; } } private: static Singelton *p_Singel; }; Singelton * Singelton::p_Singel = NULL; //靜態資料成員在類外初始化