單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。
單例模式要點:
單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式(建構函式放在private關鍵字下),二是類定義中含有乙個該類的靜態私有物件,三是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
在下面的物件圖中,有乙個"單例物件",而"客戶甲"、"客戶乙" 和"客戶丙"是單例物件的三個客戶物件。可以看到,所有的客戶物件共享乙個單例物件。而且從單例物件到自身的連線線可以看出,單例物件持有對自己的引用。
單例模式應用場景:
一些資源管理器常常設計成單例模式。
在計算機系統中,需要管理的資源包括軟體外部資源,譬如每台計算機可以有若干個印表機,但只能有乙個printer spooler, 以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干傳真卡,但是只應該有乙個軟體負責管理傳真卡,以避免出現兩份傳真作業同時傳到傳真卡中的情況。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。
需要管理的資源包括軟體內部資源,譬如,大多數的軟體都有乙個(甚至多個)屬性(properties)檔案存放系統配置。這樣的系統應當由乙個物件來管理乙個屬性檔案。
需要管理的軟體內部資源也包括譬如負責記錄**來訪人數的部件,記錄軟體系統內部事件、出錯資訊的部件,或是對系統的表現進行檢查的部件等。這些部件都必須集中管理,不可整出多頭。
這些資源管理器構件必須只有乙個例項,這是其一;它們必須自行初始化,這是其二;允許整個系統訪問自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應用。
單例模式的實現:
class a
memberfunction()
private:
a();
a( const a& rhs);
static a a;
};使用時: a;;getinstance().memberfunction(); 其中a::getinstance()得到的是物件a。
注意:該段**有個缺點,就是無論是否用到 class a與否,都會生成乙個靜態的a。為了解決這個問題,可以將static a a;放到getinstance()函式中。即,這樣。
class a;
private:
a();
a(const a& rhs);
...........................}
static a & a::getinstance()
實現單例模式及應用場景
單例模式面試經常被問 什麼情況下需要單例模式 1.每個例項都會占用資源,而且每個例項初始化都會影響效能 2.當有同步需求的時候,如日誌檔案的控制,確保只有乙個例項。上 使用裝飾器實現單例模式 def singleton cls instance def getinstance if cls not ...
單例模式應用場景
了解單例模式 單例模式實際應用場景。1.windows的task manager 任務管理器 就是很典型的單例模式 這個很熟悉吧 想想看,是不是呢,你能開啟兩個windows task manager嗎?2.windows的recycle bin 站 也是典型的單例應用。在整個系統執行過程中,站一直...
單例模式的應用場景
使用單例模式最核心的一點是體現了物件導向封裝特性中的 單一職責 和 物件自治 原則。很多時候我們要保證類的例項只有乙個。我們可能在自己的 中判斷需要的類的例項有無,無就new乙個。這樣看似不錯。問題是,你用到這個類的地方有n個,這樣你就需要n個判斷。為什麼不把這個職責交給類本身呢?然後讓類提供乙個介...