java設計模式之單例模式(1)

2021-06-22 21:34:06 字數 1815 閱讀 9406

單例模式:屬於建立型模式。專案中只存在某個類的乙個物件,而且只可能存在乙個物件。那麼我們說這個類是單例模式,也叫單態模式。

單例模式分為兩種 :懶漢式 和 餓漢式。

package com.pattern.build.singleton;

/** * 餓漢式

* @author chuer

* @date 2014-7-17 下午5:16:21

* @version v1.0

*/public class hungrysingleton

//new乙個例項

private static hungrysingleton singleton = new hungrysingleton();

//獲得例項

public static hungrysingleton getinstance()

}

分析:1:怎麼保證乙個類只存在乙個物件呢?

那就是使這個類的構造方法私有化。這樣就禁止了這個類在其他類中new,也就是只能在本類中new。

因為叫單例,所以我們通常只在本類中new乙個物件,如果需要你也可以在本類中new多個物件(我叫它非主流單例)。

2:外部怎麼得到這個物件呢?

只有唯一的一種方法,就是提供類方法(靜態方法)來獲取此類的物件。

那麼我們必須使用類變數來指向這個物件(因類方法是不能訪問成員變數的)。

3:單例模式有什麼用呢?

最常見應用比如連線池的實現。我們乙個專案中一般只需要乙個連線池,而且只需要乙個連線池的物件。

再比如你要把資料庫的某些資料在記憶體中快取乙份兒,那麼這個快取類只能有乙個物件,畢竟我們只想快取乙份兒。

資料庫連線池的實現,可以參考

package com.pattern.build.singleton;

public class lazysingleton

//類變數

private static lazysingleton singleton = null;

// 獲得例項

public static synchronized lazysingleton getinstance()

return singleton;

}}

懶漢式和餓漢式的區別:

建立例項的時機不同,懶漢在第一次訪問的時候建立例項,而餓漢在類載入的時候初始化(類載入時會初始化靜態資料)。

如果多個執行緒同時判斷都為null,那麼就會例項化多次了。所以必須加同步,除非你能保證你的**不會在多執行緒下執行。

加了同步又會出現效能問題,多個執行緒

訪問的時候必須排隊。唉,這就是延遲初始化,帶來的麻煩。

餓漢式缺點:舉個極端的例子,如果乙個專案中,有100個單例模式,而且每個模式的初始化都很耗時,假如需要1分鐘。

那麼所有的單例都是餓漢式的話,專案啟動 需要100分鐘,我的天啊!!!!我去死..如果用懶漢式就不同了,

分分鐘專案起來了,只是在使用每個單例的時候消耗1分鐘就行,是不是很爽。

總結:單例模式是使用很廣泛的一種設計模式。兩種實現方式各有優缺點,他們的優點同時又是他們的缺點。世界本來就是

矛盾的啊。可以根據自己的需求選擇使用哪一種方式來實現。

還有一種單例集前面兩種的有點與一身,那就是利用靜態內部類,**如下:

public class singleton 

public singleton getinstance()

private static class singletonholder

}

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

singleton是一種建立型模式,指某個類採用singleton模式,則在這個類被建立後,只可能產生乙個例項供外部訪問,並提供乙個全域性的訪問點。核心知識點 1.將採用單例設計模式的類的構造方法私有化 採用private修飾 2.在其內部產生該類的例項話物件,並將其封裝成private stati...

Java設計模式1 單例設計模式

1 為什麼設計成單例模式?保證類在記憶體中只有乙個物件。例如 runtime類 在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。2 單例模式設計的3種方式 1 餓漢式 推薦使用 public class singleton 2,建立本類物件,定義sta...

java設計模式之單例模式

單位面試題目中有一道關於單例模式的題目.大多數參加筆試的同事都會寫出getinstance這個函式,但是當我問起什麼情況下需要使用單例 單例具體有什麼好處的時候 static函式也可以構建唯一例項,為什麼還需要單例.從使用單例的經驗來看,如下場景下,個人感覺應該使用單例 1.如果需要構建乙個工具類,...