設計模式學習筆記 單例模式

2021-08-25 13:05:24 字數 1737 閱讀 1360

單例模式

保證乙個類有且只有乙個例項,並提供乙個訪問該例項的全域性訪問點。要提供乙個全域性訪問點,最常用的辦法便是使用類的靜態方法,靜態方法只能從類而不是從例項中呼叫。

從理解上還是比較方便理解的,特別在想象了單例模式的實際應用情況後,當乙個物件在系統中獨一無二,只能有乙個的時候,比如乙個列印裝置,乙個程序管理器等等,在這上面,覺得有些類似於多執行緒鎖的概念(所以後面會用到執行緒同步synchronized)

單例模式比較普遍的提到了3種形式(懶漢式,餓漢式,單例登錄檔)

先從最簡單的單例模式開始,對照單例模式的特點,要保證該類只有乙個例項,所以他的構造方法不可能是public的,必須為private(之後看到在某種需要的情況下,也可能是protect的),但是private建構函式以後,就會造成外界沒辦法訪問,那類也就沒有了本身的意義,所以,我們就需要提供乙個全域性訪問點,也就是提供乙個外界可以取得該類例項的方法,而同時為了保持例項的唯一性,我們在類的內部嵌入乙個靜態變數,通過檢查該變數,來保證有且僅有乙個。

public class singleton //將建構函式宣告為私有,以防止外類訪問,導致多次例項化

public static singleton getinstance()

return singleton;

}}

以上是最基本的單例模式實現,但是不用想也知道,肯定有很多缺陷,所以接下來是對他的改進

首先就是提到的執行緒安全,所以我們在構造方法上加上synchronized

public synchronized static singleton getinstance()
這樣改進以後就是所謂的懶漢式

當然還有另外乙個辦法保證不會同時2個執行緒建立了2個例項,就是將例項化提前,在靜態變數宣告的時候就同時例項化

public class singleton 

public static singleton getinstance()

}

這個也就是餓漢式單例模式

再補充乙個看到的雙重鎖(double-checked locking)

public class singleton         

public static singleton getinstance()

}

}

return singleton;

}

}

從網上看到的情況是,在不同的classloader或者虛擬機器jvm下,可能會造成結果的不可預知,所以加了2重鎖

然後查了一下volatile關鍵字,也是為了這個目的,宣告為volatile的變數就是可能產生不可預知結果的,volatile保證變數總是從記憶體中拿去(好像是這樣,誰能再補充下,也可能我理解不對

)最後是單例登錄檔

單例登錄檔就是將建立的例項放入到乙個登錄檔中(hashmap),然後每次去登錄檔中查詢例項是否被建立,同樣是為了保證唯一性,而這樣乙個機制,個人理解類似於乙個印表機請求的情況,多個列印請求1臺印表機,每次只能列印(例項化)乙個

另外看到還有用反射機制的,沒有研究。。

這些基本就是我對單例模式的了解,有錯誤的地方,希望指出

設計模式學習筆記 單例模式

定義 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例模式的通用類圖如下 如下 public class singleton public static singleton getinstance public void dosomething 這裡需要注意幾個地方 1 要定義...

設計模式學習筆記(單例模式)

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是對全域性變數的一種改進。全域性變數空間利用率比較低,且在專案中是乙個不安全隱患,特別是在多執行緒程式中,會有很多的不可 性 同時,使用全域性變數,也不符合物件導向的封裝原則。1 基礎版本 include using namespace...

設計模式 單例模式(學習筆記)

經典單例模式原理 1 單例模式 確保乙個類最多只有乙個例項,並提供乙個全域性訪問點 2 單例模式的意義 有些物件我們只需要乙個 執行緒池,快取,硬體設別等。如果多個例項會造成衝突 結果的不一致性等問題。使用靜態不變數方式來實現,或者使用全域性變數。3 單例模式類圖 經典單例模式存在的問題 改進方案 ...