單例模式應用場景及實現(By C++)
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。
單例模式要點:
單例模式的要點有三個;一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式(建構函式放在private關鍵字下),二是類定義中含有一個該類的靜態私有物件,三是該類提供了一個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
在下面的物件圖中,有一個"單例物件",而"客戶甲"、"客戶乙" 和"客戶丙"是單例物件的三個客戶物件。可以看到,所有的客戶物件共享一個單例物件。而且從單例物件到自身的連線線可以看出,單例物件持有對自己的引用。
單例模式應用場景:
一些資源管理器常常設計成單例模式。
在計算機系統中,需要管理的資源包括軟體外部資源,譬如每臺計算機可以有若干個印表機,但只能有一個Printer Spooler, 以避免兩個列印作業同時輸出到印表機中。每臺計算機可以有若干傳真卡,但是隻應該有一個軟體負責管理傳真卡,以避免出現兩份傳真作業同時傳到傳真卡中的情況。每臺計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免一個通訊埠同時被兩個請求同時呼叫。
需要管理的資源包括軟體內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性(properties)檔案存放系統配置。這樣的系統應當由一個物件來管理一個屬性檔案。
需要管理的軟體內部資源也包括譬如負責記錄網站來訪人數的部件,記錄軟體系統內部事件、出錯資訊的部件,或是對系統的表現進行檢查的部件等。這些部件都必須集中管理,不可整出多頭。
這些資源管理器構件必須只有一個例項,這是其一;它們必須自行初始化,這是其二;允許整個系統訪問自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應用。
單例模式的實現:
class A{
public:
static A& getInstance { return 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{
static A& getInstance();
memberFunction() {.....};
private:
A();
A(const A& rhs);
...........................
}
static A & A::getInstance()
{
static A a;
return a;
}