1. 程式人生 > 其它 >Java-單例模式

Java-單例模式

技術標籤:Java設計模式java

我的部落格園:https://www.cnblogs.com/djhzzl/p/14378952.html

單例模式

單例(Singleton)模式是設計模式之一,最顯著的特點就是一個類在一個JVM中只有一個例項,避免繁瑣的建立銷燬例項。


public class Singleton_Test {
    private Singleton_Test(){
        System.out.println("私有化構造方法");
    }
}

在這裡插入圖片描述
構造方法私有化(private),外部無法new例項化。


所以提供一個public static 方法 getInstance(),外部通過這個方法獲取物件,並且由於是 例項化的同一個類,所以外部每次呼叫都是呼叫同一個方法,從而實現一個類只有一個例項。

    public static void main(String args[]) {
        Singleton_Test test1 = Singleton_Test.getInstance();
        Singleton_Test test2 = Singleton_Test.getInstance();

        System.out.println(test1 == test2);
        /*輸出
        私有化構造方法
        true
         */
    }

例項化的是同一個類,只調用一次構造方法。


餓漢式

這種方式無論是否呼叫,載入時都會建立一個例項。

    private static Singleton_Test Instance = new Singleton_Test();

    public static Singleton_Test getInstance(){
        return Instance;
    }

懶漢式

這種方式,是暫時不例項化,在第一次呼叫發現為null沒有指向時,再例項化一個物件。

    private static Singleton_Test Instance ;

    public static Singleton_Test getInstance(){
        if (Instance == null){
            Instance = new Singleton_Test();
        }
        return Instance;
    }

區別

  • 餓漢式的話是宣告並建立物件(他餓),懶漢式的話只是宣告物件(他懶),在呼叫該類的 getInstance() 方法時才會進行 new物件。

  • 餓漢式立即載入,會浪費記憶體,懶漢式延遲載入,需要考慮執行緒安全問題 什麼是執行緒安全/不安全

  • 餓漢式基於 classloader 機制,天生實現執行緒安全,懶漢式是執行緒不安全。需要加鎖 (synchronized)校驗等保證單例,會影響效率

單例模式要點

  • 構造方法私有化
    private Singleton_Test(){}

  • 私有靜態(static)類屬性指向例項
    private static Singleton_Test Instance

  • 使用公有靜態方法返回例項
    public static Singleton_Test getInstance(){ return Instance;}