單例模式,也許是我們平常用得和接觸比較多的設計模式了,很多朋友在企業面試的時候都會被問到。說起這裡,我想起了當初畢業面試時那張口結舌的醜態,心中總會多少有些愧疚,痛恨自己基礎實在是糟糕。好吧,讓我們回到主題,什麼是單例模式呢?
概念:
單例模式(singleton
),它保證了乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
在c++
中,你可以直接用乙個全域性變數做到這一點,但這樣的**存在著缺陷,特別是在多執行緒程式中。使用全域性物件能夠保證方便地訪問例項,但是不能保證只宣告乙個物件——也就是說除了乙個全域性例項外,仍然能建立相同類的本地例項。
類圖:
作用:
1、控制資源的使用,通過執行緒同步來控制資源的併發訪問;
2、控制例項產生的數量,達到節約資源的目的;
3、作為通訊媒介使用,也就是資料共享,它可以在不建立直接關聯的條件下,讓多個不相關的兩個執行緒或者程序之間實現通訊。
應用場景:
1、系統的日誌輸出,因為日誌檔案都是共享並處於開啟狀態,因此最好用乙個例項去操作,不應該迴圈關閉開啟;
2、windows的
recycle bin
(**站);
3、modem的聯接需要一條且只需要一條**線;
4、windows
的task manager
(任務管理器),你永遠無法開啟兩個以上任務管理器;
5、一台
pc連乙個鍵盤等等。
**:
class csingleton
private:
csingleton(){};
static csingleton * m_pinstance;
};
從**中可以看出單例模式的特點:
1、建構函式是私用
private
的,這樣就不能在別處建立此類的例項;
2、有乙個指向唯一例項的靜態指標m_pinstance,型別也是private;
3、它有乙個公有的
getinstance
函式,可以獲取這個唯一的例項,並且只會在第一次呼叫的時候建立該例項(懶惰初始化),這種防彈設計,所有
getinstance
函式返回的都是相同例項的指標。(注意,要想返回靜態
static
的例項指標m_pinstance,getinstance
返回值也要宣告為
static。)
測試**:
static void main()
private:
csingleton(){};
static csingleton * m_pinstance;
class cgarbo //它的唯一工作就是在析構函式中刪除csingleton的例項
}//定義乙個靜態成員,程式結束時,系統會自動呼叫它的析構函式
static cgabor garbo;
};
類cgarbo
被定義為
csingleton
的私有內嵌類(無許可權控制符,預設為
private
),以防該類被在其他地方濫用。
程式定義了cgabor
的乙個靜態成員
garbo
,程式執行結束時,系統會自動呼叫csingleton
的靜態成員
garbo
的析構函式,該析構函式會刪除單例的唯一例項。
從此以後,我們再也不必關心物件的釋放,再也不用對物件的釋放做任何的操作了。
2、多執行緒下的單例模式應該如何注意?
以上的單例模式不是執行緒安全的,所以我們要用多執行緒的同步方法和雙重鎖定來改寫以上的單例模式。**如下
//執行緒同步類
class locksingleton
inline ~locksingleton()
inline void lock()
inline void unllock()
private:
handle m_hmutex;};
class csingleton
unlock();
}return m_pinstance;
}private:
csingleton(){};
static csingleton * m_pinstance;
class cgarbo //它的唯一工作就是在析構函式中刪除csingleton的例項
}//定義乙個靜態成員,程式結束時,系統會自動呼叫它的析構函式
static cgabor garbo;
};
這樣,通過第一層的判斷,我們不用讓執行緒每次都加鎖,而只是在例項未被建立的時候再加鎖處理;同時也能保證多執行緒的安全。這種做法被稱為double-check-locking
(雙重鎖定)。
以上便是我對單例模式的理解。在這過程中,我參考了很多資料,學習了很多知識,對單例模式有了更深的體會。
「我要一步一步往上爬,在最高點乘著葉片往前飛。小小的天流過的淚和汗,總有一天我有屬於我的天。」--
《蝸牛》
設計模式二三事 單例模式
一 單例模式 單例模式模式能夠保證乙個類的物件例項只有乙個,具體的做法是將類的建構函式設定為私有或者受保護,然後再提供乙個靜態介面,通過該介面可以建立或者獲取該類的唯一例項物件,具體的 如下表示 class singleton public static singleton getinstance ...
設計模式那點事 建造者模式
概念 建造者模式 builder 將乙個複雜物件的建立與它的表示分離,使得相同的構建過程能夠建立不同的表示。建造者模式能夠將乙個產品的內部表象與產品的生成過程切割開來,從而能夠使乙個建造過程生成具有不同的內部表象的產品物件。我們僅僅需指定須要建造的型別就能夠得到它們,而詳細建造的過程和細節就不需知道...
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...