建立型模式---單件模式(singleton pattern)
動機(motivation):
在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在乙個例項,才能確保它們的邏輯正確性、以及良好的效率。
如何繞過常規的構造器,提供一種機制來保證乙個類只建立乙個例項?
這應該是類設計者的責任,而不是類使用者的責任。
結構圖:
意圖:
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
------《設計模式》gof
生活的例子:
適用性:
(1)當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。
(2)當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**就能使用乙個擴充套件的例項時。
**實現:
(1)單執行緒singleton實現
class
singlethread_singleton
public
static
singlethread_singleton instance
return
instance;}}
}
以上**在單執行緒情況下不會出現任何問題。但是在多執行緒的情況下卻不是安全的。
如兩個執行緒同時執行到
if(instance
==null
)判斷是否被例項化,乙個執行緒判斷為true後,在進行建立
instance
=new
singlethread_singleton();之前,另乙個執行緒也判斷
(instance
==null
),結果也為true.
這樣就就違背了
singleton模式的原則(保證乙個類僅有乙個例項)。
怎樣在多執行緒情況下實現singleton?
(2)多執行緒singleton實現:
1class
multithread_singleton26
public
static
multithread_singleton instance718
}19}20
return
instance;
21} 22}
23 此程式對多執行緒是安全的,使用了乙個輔助物件
lockhelper,保證只有乙個執行緒建立例項(如果instance為空,保證只有乙個執行緒
instance
=new
multithread_singleton();建立唯一的乙個例項)。(double check)
請注意乙個關鍵字
volatile
,如果去掉這個關鍵字,還是有可能發生執行緒不是安全的。
volatile
保證嚴格意義的多執行緒
編譯器在**編譯時對指令不進行微調。
(3)靜態singleton實現
3class
static_singleton47
}以上**展開等同於 1
class
static_singleton28
private
static_singleton() 9}
由此可以看出,完全符合singleton的原則。
優點: 簡潔,易懂
缺點: 不可以實現帶引數例項的建立。
單件模式(單例模式)
readme 0.1 本文部分描述 head first 設計模式 旨在學習 單件模式 單例模式 的相關知識 及其應用 單件模式 1.0 單件模式的應用背景 有一些物件其實我們只需要乙個,比方說 執行緒池,快取,對話方塊,登錄檔等的物件,這都可以通過單件模式來解決 1.1 定義 確保乙個類只有乙個例...
單件模式(單例模式)
1 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。2 經典的單件模式實現 public class singleton public static singleton getinstance return uniqueinstance 問題點 public static singleto...
單例模式(單件模式)
color red size medium 單件模式,就是確保乙個類只有乙個例項,並提供乙個全域性訪問點。size color 單例的作用是獨一無二,比方說,如果有乙個登錄檔設定的物件,你不希望這樣的物件有多個拷貝吧,那會把設定搞得一團亂,利用像單例這樣的單件物件,可以確保程式中使用的全域性資源只有...