Java-單例模式
阿新 • • 發佈:2021-02-06
我的部落格園: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;}