單例模式屬於創建型模式,定義為:確保一個類只有一個實例,且自行實例化並向整個系統提供這個實例。它是 23 種設計模式中最簡單、也是實務中最常用的一種。

private 建構子:防止外部 new。private static 靜態引用:指向唯一實例。public static 獲取方法:全局訪問入口。public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return singleton; }
}
優點:線程安全、實現簡單。缺點:類載入即佔用記憶體,即使未使用。
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) { singleton = new Singleton(); }
return singleton;
}
}
優點:延遲載入。缺點:synchronized 影響性能(可用雙重檢查鎖優化,但需 volatile 修飾)。
典型場景:頻繁實例化銷毀的對象、創建耗時/耗資源的工具類、有狀態的工具類、頻繁訪問 DB/文件的對象。
Constructor.setAccessible(true) 可繞過 private 建構子創建新實例。對策:建構子中檢測實例是否存在,拋異常阻止。readResolve() 返回現有實例。null。synchronized 線程安全嗎? 安全,但性能損耗大;推薦雙重檢查鎖 + volatile 或靜態內部類寫法。private 建構子不可繼承;登記式單例可繼承。單例模式簡單但坑深。實務中推薦靜態內部類或枚舉實現,兼顧線程安全、延遲載入、防反射/序列化破壞。切記:單例的核心是「受控唯一」,而非單純的「全局變量」。