一、單例模式簡介
單例模式(Singleton Pattern)是一種常見的設計模式,在一個系統中,只有一個實例對象存在。主要優點包括:
- 節省內存空間,提高程序性能。
- 避免了對同一資源文件的多重使用。
- 避免了對實例化次數的限制。
- 可全局訪問該實例,方便地實現數據共享。
單例模式是一種創建型模式,用於提供全局唯一的對象實例。
二、單例模式的實現方式
1.懶漢式
在第一次需要使用時,才實例化單例對象。這種方式的缺點是線程不安全,在多線程情況下會出現重複實例化的問題。
懶漢式單例模式示例代碼
public class LazySingleton { private static LazySingleton instance; private LazySingleton(){} public static synchronized LazySingleton getInstance(){ if (instance == null) { instance = new LazySingleton(); } return instance; } }
2.餓漢式
在程序啟動時就實例化單例對象,避免了線程安全問題。但是如果程序中不需要使用該單例對象,就浪費了內存空間。
餓漢式單例模式示例代碼
public class HungrySingleton { private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return instance; } }
3.雙重鎖檢測
在第一次需要使用時,才實例化單例對象。採用雙重鎖檢測可以解決懶漢式的線程不安全問題。
雙重鎖檢測單例模式示例代碼
public class DoubleCheckedSingleton { private static volatile DoubleCheckedSingleton instance; private DoubleCheckedSingleton() {} public static DoubleCheckedSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedSingleton .class) { if (instance == null) { instance = new DoubleCheckedSingleton(); } } } return instance; } }
三、單例模式應用場景
1.ServletContext
在Java Web開發中,ServletContext是單例模式的典型應用。ServletContext是Java Web應用的上下文環境,是整個Web應用共享的一個對象。
2.資料庫連接池
資料庫連接池是多線程環境下使用的常見設計模式。連接池中的連接對象是單例的,多個線程同時請求時,可以極大地提高程序性能和資源利用效率。
3.日誌系統
在日誌系統中,單例對象負責收集和存儲應用程序的日誌信息。由於日誌系統對程序運行的性能影響較小,而且是一個全局共享的對象,因此採用單例模式可以方便地操作日誌對象。
四、單例模式的優缺點
1.優點
- 提供了一個全局唯一的對象實例。
- 節省內存空間,提高程序性能。
- 避免了對同一資源文件的多重使用。
- 可全局訪問該實例,方便地實現數據共享。
2.缺點
- 單例實例化後始終佔用內存空間,浪費資源。
- 不方便於擴展單例的實例數量。
- 單例對象的邏輯複雜度高,增加了系統的維護成本。
五、總結
單例模式是一種常見的設計模式,用於提供全局唯一的對象實例。其主要優點包括節省內存空間、提高程序性能、避免了對同一資源文件的多重使用以及可全局訪問該實例,方便地實現數據共享等。其缺點包括單例實例化後始終佔用內存空間、不方便於擴展單例的實例數量以及單例對象的邏輯複雜度高,增加了系統的維護成本等。在Java Web應用的上下文環境、資料庫連接池、日誌系統等多種場景下,均可以使用單例模式。
原創文章,作者:ZXZGI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/368216.html