當前位置:才華齋>計算機>java語言>

JAVA設計模式之單例模式

java語言 閱讀(5.08K)

  1. 模式介紹

JAVA設計模式之單例模式

模式的定義

確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。

模式的使用場景

確保某個類有且只有一個物件的場景,例如建立一個物件需要消耗的資源過多,如要訪問 IO 和資料庫等資源。

2. UML類圖

角色介紹:

(1)Client : 高層客戶端。

(2)Singleton : 單例類。

 3. 模式的簡單實現

public class Singleton { private static Singleton intance; private Singleton() {} public static Singleton getInstance() { /* * 一開始多執行緒進來,遇到鎖,一個執行緒進去,是為空,new物件; 後續執行緒進入,不為空,不操作;最後直接返回 * 物件不為空,再有多個執行緒進入該函式,不為空,不執行加鎖操作,直接返回 */ if (intance == null) { synchronized (s) { if (intance == null) { intance = new Singleton(); } } } return intance; } } class Singleton1 {// 懶漢式 private static Singleton1 intance = new Singleton1();//懶的,程式執行的時候就加載出來了 private Singleton1() {} public static Singleton1 getInstance() { return intance; } } class Singleton2 {// 餓漢式 private static Singleton2 intance; private Singleton2() {} public static Singleton2 getInstance() {//用到的時候 才載入 if (intance == null) { intance = new Singleton2(); } return intance; } } class Singleton3 {// 餓漢式 執行緒安全 private static Singleton3 intance; private Singleton3() {} public synchronized static Singleton3 getInstance() {//用到的時候 才載入, 加鎖 多執行緒呼叫,都有一個加鎖的動作 if (intance == null) { intance = new Singleton3(); } return intance; } } class Singleton4 {// 餓漢式 執行緒安全 private static Singleton4 intance; private Singleton4() {} public static Singleton4 getInstance() {//用到的時候 才載入 synchronized (s) {// 加鎖 效率跟3差不多 if (intance == null) { intance = new Singleton4(); } } return intance; } }

4.優點與缺點

(1)優點:

A.由於單例模式在記憶體中只有一個例項,減少了記憶體開支,特別是一個物件需要頻繁地建立、銷燬時,而且建立或銷燬時效能又無法優化,單例模式的優勢就非常明顯。

B.由於單例模式只生成一個例項,所以減少了系統的'效能開銷,當一個物件的產生需要比較多的資源時,如讀取配置、產生其他依賴物件時,則可以通過在應用啟動時直接產生一個單例物件,然後用永久駐留記憶體的方式來解決;

C.單例模式可以避免對資源的多重佔用,例如一個寫檔案動作,由於只有一個例項存在記憶體中,避免對同一個資原始檔的同時寫操作。

D.單例模式可以在系統設定全域性的訪問點,優化和共享資源訪問,例如可以設計一個單例類,負責所有資料表的對映處理。

(2)缺點

A.單例模式一般沒有介面,擴充套件很困難,若要擴充套件,除了修改程式碼基本上沒有第二種途徑可以實現。