設計模式 singleton模式

2021-06-25 17:38:23 字數 2366 閱讀 4351

使用單件模式的意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。

將單件定義為全域性或靜態物件,然後依賴於自動的初始化,並不能完全實現上述意圖。雖然可以提供全域性訪問點,但這是不夠的。原因如下:

1)我們不能保證靜態物件只有乙個例項會被宣告。

2)我們可能沒有足夠資訊在靜態初始化時例項化每個單件,單件可能需要在程式執行中稍後被計算出來的值。

3)c++沒有定義轉換單元上全域性物件的構造器的呼叫順序。這意味著單件之間不存在依賴關係;如果有,那麼錯誤將是不可避免的。

4)使用全域性或靜態物件的實現方法,使得所有單件無論用到與否都要被建立。

下面看一下,單件模式如何實現本有的意圖並解決上面的問題。

單件例項的示例**:

[cpp]view plain

copy

class singleton  

;  singleton * singleton::m_pinstance = null;  

singleton * singleton::getinstance()  

return m_pinstance;  

}  

建構函式是保護的,客戶不能自己建立該類的例項,因此只能通過靜態成員函式instance()來獲取該類的例項,靜態成員變數m_pinstance和靜態成員函式保證了只有乙個例項會被建立,而且該例項只有在第一次訪問的時候被建立。

singleton模式具有許多優點:

1)對唯一例項的受控訪問。singleton類封裝它的唯一例項,可以嚴格控制客戶怎樣及何時訪問它。

2)縮小命名空間。singleton模式是對全域性變數的一種改進,避免了那些儲存唯一例項的全域性變數汙染命名空間。

3)允許對操作和表示的精華。singleton類可以有子類,而且用這個擴充套件類的例項來配置乙個應用是很容易的。你可以用所需要的類的例項在執行時刻配置應用。

4)允許可變數目的例項。允許singleton類的多個例項,可以用相同的方法來控制應用所使用的例項數目,只有允許訪問singleton例項的操作需要改變。

5)比類操作更靈活。

下面考慮多執行緒情況下的singleton。

多執行緒時,在if(m_pinstance == null)這句,可能會有多個執行緒進入,從而導致了多個例項的建立,也造成了記憶體的洩露。所以應該加上執行緒間的互斥操作。

多執行緒單件模式示例**:

[cpp]view plain

copy

class singleton  

;  singleton * singleton::m_pinstance = null;  

singleton * singleton::getinstance()  

return m_pinstance;  

}  

這裡用雙檢查,只有在第一次建立的時候才會去考慮互斥,以提高效率。

上面的**還有乙個問題,m_pinstance所指向的空間什麼時候釋放呢, 怎麼樣完成例項的析構操作。如果類析構行為中有關閉檔案,釋放資源等操作,那麼我們的**必須在合適的時機正常的析構該例項。

下面給出解決該問題的乙個方法:

[cpp]view plain

copy

class singleton  

};  

static garbo m_garbo;  

};  

singleton * singleton::m_pinstance = null;  

singleton::garbo singleton::m_garbo; // 不要忘記此處的定義

singleton * singleton::getinstance()  

return m_pinstance;  

}  

上述方法在singleton內定義了乙個私有內嵌類,防止該類在其他地方使用。程式執行結束時,系統會呼叫singleton類靜態成員的m_garbo的析構函式,該析構函式會釋放m_pinstance例項並進行析構操作。

另外還有一種方法,但是該方法處理執行緒安全問題比較複雜,這裡暫不考慮執行緒安全,只考慮析構問題:

(未考慮執行緒安全):

[cpp]view plain

copy

class singleton  

;  singleton * singleton::getinstance()    

這種方法僅在第一次呼叫getinstance時初始化該類,在程式結束時自動析構。**簡短,是一種有效的方法。不過,不管是否用到該類,都要為該類分配空間,但是滿足在必要的時候才執行初始化操作。singleton模式是比較簡單的乙個設計模式,應用也比較多,也常常配合其他設計模式使用。

設計模式 Singleton模式

當我們想在程式中表示某個東西只會存在乙個時,就會有 只能建立乙個例項 的需求。典型的例子有表示程式所執行的那台計算機的類,表示軟體系統相關設定的類,以及表示視窗 window system 的類。singleton類只會生成乙個例項。singleton類定義了static欄位singleton,並將...

設計模式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模式用來保證乙個程序中只有乙個某型別的實體,也就是說程序中的多執行緒可能共享該實體。共享該實體是指共享該實...