Java設計模式之單例模式

1.概述

  • 什麼是單例模式
    定義:確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例
  • 單例模式包括:
    1.私有的構造方法
    2.指向自己實例的私有靜態引用
    3.以自己實例爲返回值的靜態的公有方法

2.實現單例模式的兩種方法

單例模式根據實例化對象時機的不同分爲兩種:一種是餓漢單例模式,一種是懶漢單例模式。餓漢單例模式在單例類被加載的時候,就實例化一個對象交給自己使用;懶漢單例模式在調用取得實例方法的時候纔會實例化對象。

(1)餓漢單例模式

public class Single {
    private Single(){}      //私有構造方法
    private static final Single s = new Single();       //指向自己實例的私有靜態引用
    public static Single getInstance(){     //以自己實例爲返回值的靜態的公有方法
        return s;
    }
}
 
public static void main(String[] args){
    Single s = Single.getInstance();
}

(2)懶漢單例模式

public class Single {
    private Single(){}      //私有構造方法
    private static Single s = null;       //指向自己實例的私有靜態引用
    public static Single getInstance(){     //以自己實例爲返回值的靜態的公有方法
        if(s == null){
            s = new Single();
        }
        return s;
    }
}
 
 
public static void main(String[] args){
    Single s = Single.getInstance();
}

3.單例模式的優點

  • 在內存中只有一個對象,節省內存空間
  • 避免繁瑣的創建銷燬對象,可以提高性能
  • 避免對共享資源的多重佔用
  • 可以全局訪問

4.單例模式使用場景

  • 需要頻繁實例化然後銷燬的對象
  • 創建對象時耗時過多或者耗資源過多,但又經常用到的對象
  • 有狀態的工具類對象
  • 頻繁訪問數據庫或文件的對象
  • 只有一個對象的場景

5.單例模式注意事項

  • 只能使用單例類的方法得到單例對象,不要使用反射,否則將會實例化一個新對象
  • 不要做斷開單例對象與類中靜態引用的危險操作
  • 多線程使用單例模式共享資源時,注意線程安全問題

懶漢單例模式線程安全問題:

public class Single {
    private Single(){}      //私有構造方法
    private static Single s = null;       //指向自己實例的私有靜態引用
    public static Single getInstance(){     //以自己實例爲返回值的靜態的公有方法
        if(s == null) {     //提高程序的執行效率,已經創建了就不用再創建
            synchronized (Single.class) {   //加synchronized關鍵字防止再次創建對象
                if (s == null) {
                    s = new Single();
                }
            }
        }
        return s;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章