設計模式(五) 單例模式(Singleton)

2021-06-28 09:46:24 字數 1581 閱讀 9469

單例模式是一種建立型的設計模式。單例模式意在保證乙個類僅有乙個例項,並且提供乙個全域性的訪問點。

乙個國家只有乙個主席/**,乙個人只有乙個名字/身份證號,這些都是單例的例子。稍微實際點的例子就是,在某個伺服器程式中,將伺服器的配置資訊存放在乙個檔案中,這些配置資料有乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

參與者:

singleton

—— 定義乙個instance操作,允許客戶訪問它的唯一例項。instance是乙個類操作

—— 可能負責建立它自己的唯一例項

我們先來實現乙個簡單的單例:

package com.andy.designpattern.singleton;

public class singleton

public static singleton getinstance()

return instance;

}}

我們將建構函式設為private型別,使得客戶無法構造多餘的例項;instance設為類的類變數,保證類只有乙個。乍看之下,這樣的實現已經很完美了,但是這個方案在遇到多執行緒的時候還是會出問題:幾個執行緒同時請求getinstance,可能多個執行緒同時通過if(instance == null)的檢查,這樣就可能產生多個例項。所以我們需要對上面的例子進行改進。 

第乙個中改進方案是在類裝載的時候構建靜態單例,請求get的時候直接返回:

package com.andy.designpattern.singleton;

public class singleton

public static singleton getinstance()

}

第二種改進方案是通過synchronized、volatile等關鍵字將原始方案改寫為執行緒安全的方案(此方案只適用於jdk5之後的版本,之前的版本使用「雙重檢查鎖」會發生非預期行為):

package com.andy.designpattern.singleton;

public class singleton

public static singleton getinstance()

}} return instance;

}}

這裡為什麼需要檢查兩次instance == null呢?

把instance宣告為volatile有兩個作用:

其實單例模式還是比較簡單的,就是說乙個類只能有乙個例項,於是我們把它宣告為乙個類的類變數,需要使用時判斷是否存在,若存在即返回;若不存在,則呼叫私有構造器構造並返回。

維基百科——單例模式

設計模式學習筆記十:單例模式 by 竹子-部落格

深入淺出單例項singleton設計模式 by 陳皓

design pattern - singleton pattern

Java設計模式 單例模式(single)

目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...

設計模式(五) 單例模式

單例模式,主要由以下幾個模組組成 私有的靜態物件例項,私有的構造方法 避免外部呼叫new物件,保證只有乙個物件的例項 乙個共有的靜態獲取物件的方法 供外部呼叫 如下 懶漢式單例模式 在需要的時候,也即呼叫共有的靜態獲取物件的方法時才建立物件 package singlepattern public ...

設計模式(五) 單件模式(單例模式)

三 單件模式的多執行緒安全問題 參考確保乙個類只有乙個例項,並提供乙個全域性訪問點。單件模式即單例模式。使用場景很多,比如多個程式都要使用乙個配置檔案中的資料,而且要實現資料共享和交換。必須要將多個資料封裝到乙個物件中,而且多個程式操作的是同乙個物件,也就是說必須保證這個配置檔案物件的唯一性。有兩種...