Java設計模式 設計模式之單例詳解

2021-07-24 11:23:42 字數 3041 閱讀 6609

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證應用中乙個單例類只有且只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並提供全域性訪問點。

實現單例三要素

教科書中的示例是很簡單的,要想實現乙個單例類,只需要三點:

1、定義私有的靜態成員

2、私有化構造方法

3、提供公有的靜態工廠方法

單例的種類(餓漢模式/懶漢模式)

餓漢模式:類載入的時候都會去建立例項;

懶漢模式:只在外部物件第一次請求例項的時候才去建立,如果沒有就立即建立乙個物件,然後返回,如果已有物件就不再建立,立即返回。

兩種模式的區別

懶漢模式在類載入的時候比較快,獲取物件比較慢;

餓漢模式在類載入的時候比較慢,獲取物件比較快;

注:餓漢模式是執行緒安全的,而懶漢模式是執行緒不安全的

餓漢式單例

package com.wxl.singleton;

/** * @author wxl

* @remark 單例模式--餓漢式實現

* 作用:保證整個應用程式中某個例項有且只有乙個

* 型別:餓漢模式/懶漢模式

* @version 1.0

*/public class singletoneager

/*** 提供乙個外部可以訪問的獲取例項方法

* @return

*/public static singletoneager getinstance()

}

懶漢式單例

package com.wxl.singleton;

/** * @author wxl

* @remark 單例模式--懶漢式實現

* 作用:保證整個應用程式中某個例項有且只有乙個

* 型別:餓漢模式/懶漢模式

* @version 1.0

*/public class singletonlazy

/*** 提供乙個外部可以訪問的獲取例項方法

* @return

*/public static singletonlazy getinstance()

return instance;

}}

靜態內部類方式(企業用的最多)

兼併了併發高效呼叫和延遲載入的優勢

package com.dw.develop;

/** * 靜態內部類實現單例(另一種懶載入方式)

* * @author administrator

* @version v1.0

* @date 2018-12-20

* @modify

*/public class singleton

/*** 靜態內部類

*/private static class singletonclass

/*** 提供外部訪問單例方法

** @return

*/public static singleton getinstance()

}

單例模式執行緒測試類

package com.wxl.singleton;

public class singletonthreadsecurity implements runnable

}

單例模式單元測試類

package com.wxl.singleton;

import static org.junit.assert.*;

import org.junit.test;

public class singletontest

/*** 測試懶漢模式

*/@test

public void testsingletonlazy()

/*** 測試執行緒安全

*/@test

public void testthreadsecurity()

/*** 測試靜態內部類實現單例

*/@test

public void teststaticclass()

}

餓漢模式測試

懶漢模式測試

餓漢模式與懶漢模式多執行緒測試

靜態內部類測試

測試結論:經過大量的實驗,多執行緒情況下懶漢模式實現的單例所得到的例項不是唯一的,而餓漢模式得到的例項始終是同乙個;

懶漢模式執行緒不安全解決方案

/**

* 執行緒同步鎖

*/private static object synchrolock = new object();

/*** 提供乙個外部可以訪問的獲取例項方法

* @return

*/public static singletonlazy getinstance()

}return instance;

}

記憶體**

總之,雖然單例看上去很美,但還是有這麼多需要認真思考、妥善決策的技術要點,用好單例並不像我們在教科書中看到的那樣簡單。

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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