主要是從 head fisrt 設計模式中學習到知識;
1. 定義單件模式
單件模式確保乙個類只有乙個例項,並提供乙個全域性訪問點;
在整個系統上下文中,只有乙個物件,對於很多在系統中只需要乙個或者建立代價比較大的物件,可以使用,例如:執行緒池、快取、對話方塊、處理偏好設定和登錄檔物件、日誌物件、充當印表機、顯示卡等裝置的驅動程式的物件;
採用單件模式可以避免系統維護太多沒有記錄狀態資料、所有例項功能可替代的相關物件,還有就是多個例項處理會可能會造成結果不一致的問題;
2. 主要思想
2.1 由類持有乙個靜態的類物件,並通過方法暴露對類物件的獲取介面;
2.2 類禁止外部物件例項化
3. 單件模式的實現
3.1 下面是單件模式的簡單實現,思想就是持有乙個靜態物件,當需要的時候就通過類的公用方法獲取物件的引用,這裡還有乙個做法就是延遲例項化,當物件需要用到的時候才會去例項化物件,如果物件沒有被引用到,那麼就是一直都不會例項化,系統資源也不會浪費。
public這裡列印出來,幾個類的物件的記憶體位址都是同乙個,引用了同乙個物件。class
singleton
public
static
singleton getinstance ()
}return
uniqueinstance;
} public
static
void
main(string args)
}
4. 單件模式和多執行緒
上面的單件模式實現已經能夠滿足基本的使用要求,但是當單件模式模式遇到多執行緒之後,很多奇怪的問題就發生了(事實上很多**遇到多執行緒後都會有問題),
例如上面的例子,當**的推進狀態像下面的狀態,就會出現問題:
這個時候物件已經不是同乙個了,多執行緒造成 單件模式 已經和我們定義的不一樣了。
為了解決這個問題,有以下的三個解決方法:
* 使用synchronized方法,將getinstance()變成同步的方法,這樣能夠解決我們的問題,但是例項化只是在第一次的時候使用,後面就沒有這個問題存在了,然後通過synchronized強制同步會降低系統的併發效能,這種情況適合getinstance()的效能不影響或者影響了可以接受的地方;
public* 使用「雙重檢查加鎖」( since jdk 1.4 )static
synchronized
singleton getinstance ()
public
static
singleton getinstance ()
}
使用之後**是這樣子的:
public通過 volatile 標識該變數的修改是對其他執行緒可見的,還有禁止指令排序;詳細用法見:位址class
singleton
public
static
singleton getinstance () }}
return
uniqueinstance;
} public
static
void
main(string args)
}
然後當判斷是未初始化的時候,再將類進入鎖定然後再次判空之後再初始化類,這樣就解決了我們前面遇到的問題,也很好的實現了單件模式的理念。
設計模式 單件模式
1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...
設計模式 單件模式
2015年1月29日16 02 59 單件模式是用來保證共有資源唯一性的設計模式,舉個例子吧,假如我們是藝人,我們在同乙個經紀人的協助下開展工作,我們可以委託這個經紀人做一些事情,但是我們不能委託經紀人在幫你做報表的同時幫我訂外賣。用程式猿的語言來表達就是,我們可能在多處地方持有對同一資源的引用。由...
設計模式 單件模式
保持單一物件有時非常必要,尤其是資源類,比如視窗資源,登錄檔等等,所謂的單件模式的定義是 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。其類圖雖說比較簡單,但單例模式還是有很多陷阱的。首先,給出單例模式的經典的懶漢式寫法 懶漢式 需要例項物件時才建立,延遲建立 class single pubi...