設計模式之單例模式(通俗易懂,超詳細)

2021-10-08 03:19:16 字數 2324 閱讀 6361

簡單來說單例模式就是指在記憶體中只會建立且僅建立一次物件的設計模式,當程式中其他地方需要使用到該物件的相同功能時,都會呼叫建立好的這乙個,不會再額外建立例項,這樣做的好處就是避免過多的建立相同作用的物件使得記憶體浪費。

在單例模式中主要分為兩類,分別是懶漢式和餓漢式

懶漢式:在程式呼叫時才建立例項

餓漢式:在程式載入時就建立好例項,等待被呼叫

懶漢式是在程式呼叫時才會建立例項,在程式呼叫時首先會進行判斷,如果已經存在該例項,則直接返回,若不存在該例項則建立並返回,懶漢式流程圖如下:

**實現

為避免類被多次例項化,所以將類中的建構函式限定為private,這樣就能保證其他程式無法通過new關鍵字來例項化,達到真正的單例。

package com.lee.singleton;

public

class

singleton

public

static singleton getinstence()

}

通過以上**就簡單的實現了懶漢式的單例模式,但是在上面的**中還有不完美的地方:如果當程式為多執行緒時,那麼如果執行緒a和執行緒b同時呼叫了singleton的getinstence()方法,然後同時進入了if判斷,這樣的話由於執行緒不安全就會導致被例項化兩個物件。

下面通過兩個執行緒來模擬呼叫該單例模式程式,然後通過例項的hashcode來判斷是只建立了乙個物件還是建立了兩個物件。

測試多執行緒呼叫單例模式

public

class

singletontest};

thread.

start()

; thread thread2 =

newthread()

};thread2.

start();}}

執行結果如下所示:

由結果我們可以看到兩個執行緒所建立的物件的hashcode值不一樣,那麼也就代表如果多執行緒呼叫該單例模式則會出現執行緒安全問題。

如果說到解決執行緒安全問題,最先想到的肯定就是synchronized方法和synchronized**塊。最簡單的就是在getinstence方法上加上synchronized,這樣當乙個執行緒進入到該方法時,另外的執行緒就無法進入,可以確保單例。

使用synchronized

//方法加synchronized鎖的方式

public

synchronized

static singleton getinstence()

//synchronized**塊的方式

public

static singleton getinstence()

return instence;

}

但是使用以上方法還是不夠完美,那就是當已經有了例項之後每次呼叫getinstence還是會首先獲取到鎖,然後再進行判斷,這樣當高併發的情況下效能就會及其低下,所以如果需要安全並且效能好的話就只能使用以下方法。

最終優化方法

public singleton getinstence()

}}return instence;

}

餓漢式是指在程式載入時就建立物件,當需要呼叫時則直接返回例項,不需要和懶漢式一樣進行判斷是否例項化,餓漢式流程圖如下所示:

**實現

public

class

singleton

public singleton getinstence()

}

單例模式就是在記憶體中只會建立且僅建立一次物件的設計模式,因為只建立一次物件,所以構造方法私有化,通過getinstence方法獲取物件。

單例模式分為懶漢式和餓漢式,懶漢式是在呼叫時建立物件,需要注意執行緒安全和效能優化,餓漢式是在程式載入時就建立物件,需要時直接呼叫。

在開發時如果對於記憶體的要求特別高,使用懶漢式,在需要時才建立,如果對記憶體要求不高使用餓漢式,餓漢式簡單不易出錯,而且沒有併發安全和效能問題。

小白理解的單例模式(通俗易懂)

1 單例模式 是一種常用的軟體設計模式,屬於建立型模式的一種。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。2 實現單例模式的思路是 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時,如果類持有的引...

裝飾者設計模式 通俗易懂

精選30 雲產品,助力企業輕鬆上雲!裝飾模式 在不改變 原有類 和 不使用繼承的情況下,動態地擴充套件乙個物件的功能。因會建立乙個包裝物件,來包裹真實物件而得名。作用 增強物件的功能 例子1 牆 功能 遮風擋雨 包了牆紙的牆 本質還是牆 原功能 遮風擋雨 新增功能 陶冶情操 1 沒有改變原有類 2 ...

裝飾者模式之通俗易懂

一句話 需要包裝,但不改變本質 同宗同源 在不改變原有物件的基礎之上,將功能附加到物件上。提供了比繼承更有彈性的替代方案 擴充套件原有物件功能 特點 1 注重覆蓋 擴充套件。2 裝飾器和被裝飾器都實現同乙個介面,主要目的是為了擴充套件之後依舊保留 oop 關係 同宗同源 3 滿足 is a 的關係。...