JAVA設計模式之單例模式

2021-09-14 01:01:56 字數 2016 閱讀 3590

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項。

需要:(1)將構造方法私有化,使其不能在類的外部通過new關鍵字例項化該類物件。

(2)在該類內部產生乙個唯一的例項化物件,並且將其封裝為private static型別。

(3)定義乙個靜態方法返回這個唯一物件。

餓漢模式

/**

* created by yd on 2019/3/29.

* 餓漢式

*/public

class

singleton

// 靜態方法返回該例項

public

static singleton getinstance()

}

這種方式在類載入時就完成了初始化,所以類載入較慢,但獲取物件的速度快。 這種方式基於類載入機制避免了多執行緒的同步問題,但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化instance顯然沒有達到懶載入的效果。

懶漢模式(執行緒不安全)

/**

* created by yd on 2019/3/29.

* 懶漢式 執行緒不安全

*/public

class

singleton2

// 靜態方法返回該例項

public

static singleton2 getinstance()

return singleton;

}}

懶漢模式申明了乙個靜態物件,在使用者第一次呼叫時初始化,雖然節約了資源,但第一次載入時需要例項化,反映稍慢一些,而且在多執行緒不能正常工作。

懶漢模式(執行緒安全)

/**

* created by yd on 2019/3/29.

* 懶漢式 執行緒安全

*/public

class

singleton3

// 靜態方法返回該例項,加synchronized關鍵字實現同步

public

static

synchronized singleton3 getinstance()

return singleton;

}}

這種寫法能夠在多執行緒中很好的工作,但是每次呼叫getinstance方法時都需要進行同步,造成不必要的同步開銷,而且大部分時候我們是用不到同步的,所以不建議用這種模式。

雙重檢查模式 (dcl)

/**

* created by yd on 2019/3/29.

* 懶漢式 執行緒安全

*/public

class

singleton4

// 靜態方法返回該例項,加synchronized關鍵字實現同步

public

static singleton4 getinstance()

}}return singleton;

}}

方法四算是單例模式的最佳實現方式。記憶體佔用率高,效率高,執行緒安全,多執行緒操作原子性。

靜態內部類單例模式

/**

* created by yd on 2019/3/29.

*/public

class

singleton5

public

static singleton5 getinstance()

private

static

class

singletonholder

}

第一次載入singleton類時並不會初始化sinstance,只有第一次呼叫getinstance方法時虛擬機器載入singletonholder 並初始化sinstance ,這樣不僅能確保執行緒安全也能保證singleton類的唯一性,所以推薦使用靜態內部類單例模式。

java設計模式之單例模式

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

java設計模式 之 單例模式

單例模式 有些類在程式執行過程中只需要儲存乙個例項,比如檔案管理類,音訊管理類,那麼我們如何實現乙個單例類呢?有以下幾點 1 定義乙個靜態變數 2 建構函式私有化 3 提供乙個public 靜態方法,獲取這個例項 4 一定要做執行緒同步 public static class singleton p...

Java設計模式之單例模式

說到單例模式 大家一定非常熟悉 這是最常見也是設計模式中相對簡單 好理解的設計模式 今天就跟大家掰一掰單例模式 單例模式確保某個類只有乙個例項 應用場景 執行緒池 快取 等物件常常被設計成單例 然而單例分兩種 1 惡漢式 2 懶漢式 我們先來看下 惡漢式 public class singleton...