標籤:

設計模式之單例模式

定義:確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。

類型:創建類模式

在實際編程中,我們常常需要在運行過程中只創建一個對象,在執行過程中僅對這個對象進行操作,比如對資料庫的連接類,我們並不希望每次操作資料庫的時候都連接資料庫,每次都產生一個資料庫連接對象,我們希望在第一次連接資料庫的時候創建該對象,而以後在每次操作中使用先前已經創建好的對象,可以理解為全局訪問。

類圖表示:

單例類擁有以下幾個要素:

  • 私有構造方法(保證客戶端無法去實例化該對象)
  • 指向自己實例的私有靜態引用
  • 以自己實例為返回值得靜態的共有的方法

單例模式根據實例化對象的時機不同分為兩種方式:

餓漢式單例:單例類在被編譯載入時候,就實例化一個對象交給自己的引用

public class Singleton {n private static Singleton singleton = new Singleton();n private Singleton() {}n public static Singleton getInstance() {n return singleton;n }n}n

懶漢式單例:在第一次調用實例方法的時候才會實例化對象

public class Singleton {n private static Singleton instance = new Singleton();n private Singleton() {}n public static Singleton getInstance() {n return instance;n }n}n

懶漢式單例在單線程中表現的很好,但是如果在多線程並發的環境中就不敢保證了,所以如果需要使用懶漢式單例模式的話最好加個鎖,避免並髮帶來的錯誤,保證線程安全。

public class Singleton {n private static volatile Singleton instance;n private Singleton() {}n public static Singleton getInstance() {n if(instance == null) {n synchronized(Singleton.class) {n if(instance == null) {n instance = new Singleton();n }n }n }n return instance;n }n}n

使用場景:

  • 需要頻繁實例化然後銷毀的對象
  • 創建對象時耗時或者耗費資源過多,但又經常使用的對象
  • 頻繁訪問資料庫或者文件的對象
  • 要求只能存在一個對象

單例模式的優點:

  1. 在內存中只有一個對象,節省內存空間
  2. 避免頻繁地創建銷毀對象,可以提高性能
  3. 避免對共享資源的多重佔用
  4. 可以全局訪問

推薦閱讀:

抽象工廠模式和工廠模式的區別?
敏捷開發中如何保證界面設計?
狀態模式和策略模式的區別與聯繫?
一個靜態類或者非靜態類,多個方法依賴一個函數,如何實現?
C++模版類如何動態獲取類型?

TAG:设计模式 |