什麼是singleton模式?
sigleton模式的設計意圖是:保證乙個類只有乙個物件例項,並提供乙個訪問物件例項的全域性訪問點。
如果我們想實現乙個全域性範圍可見的物件以替代麻煩纏身的全域性變數,那麼最好的做法就是將資料封裝在乙個特殊的類中。這個嚴格管理資料的建立過程以保證資料的唯一性,同時不允許程式設計師隨意建立該類的物件例項。雖然不能通過類的建構函式獲得物件例項,但可以通過該類提供的靜態成員函式得到該類唯一的物件例項的指標或引用。
singleton模式和全域性變數有什麼區別:
全域性變數的問題:
(1)變數名衝突:必須小心維護變數名規則,所有工程師在開發**時,每遇到乙個全域性變數,都必須仔細分辨該變數究竟屬於哪個模組、哪個程式。
(2)耦合度難題:全域性變數實際上增加了函式與模組之間的耦合度。用通俗的話說,需要訪問某個特定全域性變數的多個函式被該變數牢牢地「粘結」在一起,成為拆不散的一團亂麻。
(3)單個實體問題:全域性變數不能阻止程式設計師定義乙個類的多個物件例項。如果沒有其它技術手段幫助,保證乙個類只有單個例項就全靠程式設計師的自覺。
(4)初始化順序:全域性變數不能保證相互之間遵循特定的初始化順序,這完全由編譯器決定。對於類的物件例項,建構函式被呼叫的順序有時就顯得非常重要。
(5)多執行緒訪問:當多個併發的執行緒都需要訪問某些全域性變數時,我們必須使用各種同步機制,小心地保護這些全域性變數,以免陷入併發衝突的泥潭。
singleton模式的優點:
1)跨平台:使用合適的中介軟體,可以把singleton模式擴充套件為跨多個jvm和多個計算機工作。
2)適用於任何類:只需把乙個類的建構函式變成私有的,並且在其中增加相應的靜態函式和變數,就可以把這個類變成singleton。
3)可以透過派生建立:給定乙個類,可以建立它的乙個singleton之類。
4)延遲求值:如果singleton從未使用過,那麼就決不會建立它。
singleton模式的代價 :
1)摧毀方法未定義:沒有好的方法去摧毀乙個singleton,或者解除其職責。即使新增乙個decommission方法把theinstance置為null,系統中的其他模組仍然持有對該singleton例項的應用。這樣,隨後對instance方法的呼叫會建立另外乙個例項,致使同時存在兩個例項。這個問題在c++中尤為嚴重,應為例項可以被摧毀,可能會導致去提領乙個已被摧毀的物件。
2)不能繼承:從singleton類派生出來的類並不是singleton。如果要使其成為singleton,必須要增加所需的靜態函式和變數。
3)效率問題:每次呼叫instance方法都會執行if語句。就大多數呼叫而言,if語句是多餘的。
4)不透明性:singleton的使用者知道它們正在使用乙個singleton,因為它們必須要呼叫instance方法。
singleton模式示例**:
class singleton
//建構函式為private
public static singleton instance() }
}運用singleton模式:
多個應用程式都需要列印log資訊,比如向同乙個控制台或者同乙個檔案輸出。此時是需要用到單一模式的,在多個程序或執行緒中,只能生成乙個類的物件例項。
利用static關鍵字建立單一物件的資料結構 可以用在很多地方!在配合模板與類繼承機制,可以達到乙個管理器的作用!
基本**:
class singleton
;~singleton() } ;
}singleton* singleton::minstance = 0;
singleton* singleton::getsingleton()
在外部呼叫的時候不用考慮這個物件的記憶體管理!把構造放在私有空間,保證只有乙個物件可以分配記憶體,外面呼叫的時候直接使用介面 singleton::getsingleton();
但是這個函式侷限性很大!不能擴充套件!
結合模板後可以更好的利用這種設計模式,**如下:
template
class singleton
;~singleton(){} ;
static t* getsingletonptr(void)
;static t& getsingleton(void)
;protected:
private:
static t* msinstance;
};只要有上面有這樣乙個模板類,以後的一些管理類就可以繼承這個類
class manager :public singleton
完成宣告後還需要初始化一下 模板的靜態成員
template<> manager* singleton::msinstance = 0;
在使用 manager mgr = manager::getsingleton();前需要先外部分配記憶體
也就是程式初始化的時候宣告乙個manager* mgr = new manager();
以後不管在哪個類裡面只需要包含一下manager.h就可以使用靜態函式獲得manager的物件記憶體來完成管理
單一設計模式
單一設計模式,顧名思義就是產生乙個物件到單一例項,算是設計模式中最簡單也是最容易理解的一種模式了。單一設計模式的設計很簡,單目前主要有兩種方法,要注意的是要把類到建構函式設為私有的,防止物件可以直接new乙個例項出來,下面一種是很常見到一種。這種設計方法,很簡單也很清晰,當要產生乙個例項的時候,只要...
設計模式Singleton
設計模式singleton 引言 相信大多數拜讀過 gang of four erich gamma,richard helm,ralph johnson,john vlissides 的經典之作 design pattern 的同僚們,對這本書一定推崇有加。曾有人這麼宣告 只有在讀過 design...
設計模式 Singleton
關於singleton模式的理解與思考 1 singleton模式最常用的解決方案是什麼?2 singleton如何保證執行緒安全性?3 singleton物件的析構如何完成?singleton模式用來保證乙個程序中只有乙個某型別的實體,也就是說程序中的多執行緒可能共享該實體。共享該實體是指共享該實...