單例模式是一種建立型的設計模式。單例模式意在保證乙個類僅有乙個例項,並且提供乙個全域性的訪問點。
乙個國家只有乙個主席/**,乙個人只有乙個名字/身份證號,這些都是單例的例子。稍微實際點的例子就是,在某個伺服器程式中,將伺服器的配置資訊存放在乙個檔案中,這些配置資料有乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。
參與者:
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 ...
設計模式(五) 單件模式(單例模式)
三 單件模式的多執行緒安全問題 參考確保乙個類只有乙個例項,並提供乙個全域性訪問點。單件模式即單例模式。使用場景很多,比如多個程式都要使用乙個配置檔案中的資料,而且要實現資料共享和交換。必須要將多個資料封裝到乙個物件中,而且多個程式操作的是同乙個物件,也就是說必須保證這個配置檔案物件的唯一性。有兩種...