java設計模式之單例模式

2021-08-18 03:28:41 字數 1420 閱讀 2351

singleton擁有乙個私有建構函式,確保使用者無法通過

new直接例項它。除此之外,該模式中包含乙個靜態私有成員變數

instance

與靜態公有方法

instance()

。注意:不要使用單例模式訪問全域性變數。這違背了單例模式的用意,最好放到對應類的靜態成員中。

不要將資料庫連線做成單例,因為乙個系統可能會與資料庫有多個連線,並且在有連線池的情況下,應當盡可能及時釋放連線。singleton模式由於使用靜態成員儲存類例項,所以可能會造成資源無法及時釋放,帶來問題。

sealed class singleton

singleton類被宣告為

sealed

,以此保證它自己不會被繼承。也有一些問題,比如無法繼承,例項在程式一執行就被初始化,無法實現延遲初始化等

解決的問題:保證乙個類在記憶體中的物件是唯一的(對於多個程式使用同乙個配置資訊物件時,就需要保證該物件的唯一性

)如何保證物件的唯一性呢?

1、不允許其他程式用new建立該類物件

2、在該類中建立乙個本類例項

3、對外提供乙個方法可以讓其他程式獲取該類物件

步驟:1、私有化該類的建構函式

2、通過new在本類中建立乙個本類物件

3、定義乙個公有的方法,將建立的物件返回

值得注意的是懶漢式(即延遲載入

)單例設計模式存在著多執行緒安全隱患,為解決該問題,需加上同步**塊

synchronized(

當前類名

.class)

,同步鎖為當前類名

.class

。注意不能為

this

,因為該函式為靜態函式不允許

this

出現。此外,還在同步**塊之前又加了一次

if語句判斷。該語句是為了提高**的效率,避免每個執行緒都要進行同步鎖的判定。

餓漢式和懶漢式的區別:

在單執行緒中,餓漢式是空間換取時間(效率

),懶漢式是時間換取空間。

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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