設計模式學習筆記之 單件模式

2021-07-13 06:43:24 字數 1654 閱讀 2777

單件模式的關鍵是確保只有乙個例項。

(1)經典單件模式(又稱懶漢模式):

public

class singleton

public

static singleton getinstance()

return uniquesingleton;

}}

特點:

(1)構造方法是私有的,僅在singleton類內部才可以被呼叫;

(2)getinstance()方法是靜態方法,用它來例項化物件;

(3)uniquesingleton是乙個靜態變數,僅被賦值一次;

(4)這是一種lazy(延遲)例項化方式,只有在uniquesingleton物件被用到時,才會被例項化,否則不會例項化

注意,這裡有乙個隱患,該單件模式是非執行緒安全的。對於多執行緒情況,可能建立多個例項

解決執行緒安全的最簡單方式如下:

public

class singleton

public

static synchronized singleton getinstance()

return uniquesingleton;

}}

即將getinstance()方法設定成synchronized。這樣一來,執行緒安全問題就得到解決啦。

但是,這樣又引入了另外乙個問題,將getinstance()方法設定成同步會降低程式效能。對於getinstance()方法呼叫不多的情況下,程式所受影響應該還好,但如果頻繁使用的話,程式效能就會明顯受影響啦。而且,單件模式的根本,我們只需要建立乙個例項。但是每次呼叫getinstance()方法,都同步,不划算。、

基於上述原因,還有另外一種解決執行緒安全的方法,那就是「急切」建立例項的方法:

(2)急切單件模式

public

class singleton2

public

static singleton2 getinstance()

}

即在靜態初始化器中建立單件。jvm會保證在任何執行緒訪問uniquesingleton2靜態變數之前,一定先建立此例項。

另外一種減少同步的方法就是利用「雙重檢查加鎖」的方法,這也引出了單件模式的第三種模式:

(3)「雙重檢查加鎖」單件模式:

public

class singleton3

public

static singleton3 getuniqueinstance()}}

return uniqueinstance;

}}

分析:

(1)getuniqueinstance()方法中外層判斷僅在首次例項化時執行一次,避免了synchronized降低效率的問題;

(2)內層if (uniqueinstance == null)判斷確保了在建立uniqueinstance例項前,uniqueinstance未被例項化,保證了執行緒安全。

(3)注意,宣告uniqueinstance時, volatile關鍵字可以確保當變數uniqueinstance被初始化成singleton3時,多個執行緒間可以正確的處理uniqueinstance變數。

學習筆記 設計模式 4 單件模式

在乙個大型系統中,不可避免的會出現只能存在乙個的類,比如執行緒池,對話方塊,配置設定等等,如果參與開發系統的人不止乙個 這是很常見的場景 就無法保證不會有兩個人同時在自己的 裡例項化了這個只能存在乙個的類。下面介紹的單件模式 單例模式 就可以在根源 只能存在乙個的類 上避免出現上面的問題。首先介紹一...

設計模式學習筆記(十四 單件模式)

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。這就是單件模式的定義。在某些情況下,我們可能需要某個類只能建立乙個物件,即不讓使用者用該類例項化出多於兩個的例項。例如,在乙個公文管理系統中,公文類的例項 公文檔案 需要將公章類的例項作為自己的乙個成員,以表明自己是乙個有效的公文檔案,那麼系統...

設計模式之單件模式

有一些物件我們只需要乙個 也只能有乙個 比如 執行緒池 cache 對話方塊 處理偏好設定和登錄檔的物件 日誌物件 充當印表機 顯示卡等裝置的驅動程式的物件。利用靜態類變數 靜態方法和適當的訪問修飾符,就可以做到只存在乙個例項。這是乙個經典的單件模式 public class singleton p...