Singleton單例模式
單例類負責創建自己的唯一實例,併爲其他對象提供這一實例。
主要解決:一個全局實用類頻繁地創建與銷燬。
關鍵:構造函數私有化
舉個栗子(=.=)
//創建一個單例類
public class Singleton {
//創建自己的唯一實例
private static Singleton instance = new Singleton();
//構造函數私有化
private Singleton() {
}
//爲外界提供唯一對象
public static Singleton getInstance(){
return instance;
}
public void show(){
System.out.println("summer vibe");
}
}
測試類
public class Test {
public static void main(String[] args) {
//從單例類那兒拿到唯一對象
Singleton singleton = Singleton.getInstance();
//調用單例類方法
singleton.show();
}
}
運行結果:
summer vibe
-----------------這裏是分割線-------------
單例模式的實現方式
1、懶漢式(線程不安全)
特點:最基本的實現方式,懶加載,不支持多線程
public class Singleton{
//懶加載
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懶漢式(線程安全)
優點:第一次調用才初始化,避免內存浪費。
缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
} return instance;
}
}
2、餓漢式
優點:沒有加鎖,執行效率會提高。( 基於 classloader 機制避免了多線程的同步問題)
缺點:類加載時就初始化,浪費內存。
public class Singleton {
//類裝載時就實例化
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
還有幾種實現方式,後續更新吧。。。。。。