Singleton 僅允許存在單一實例,常用於代表系統中本質上唯一的組件。主要有三種實作途徑:
final 欄位 + 私有建構子
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1() { }
}
優點:API 明確表明該類別為 Singleton。缺點:無法靈活控制實例化時機,且難以防禦反射攻擊。
public class Singleton2 {
private static final Singleton2 INSTANCE = new Singleton2();
private Singleton2() { }
public static Singleton2 getInstance() { return INSTANCE; }
}
此方式允許延遲初始化,並可在工廠方法中加入防禦邏輯(如阻擋反射創建第二個實例)。但需額外處理序列化問題:實作 Serializable 並提供 readResolve 方法,否則反序列化會產生新實例。
protected Object readResolve() { return INSTANCE; }
public enum Singleton3 {
INSTANCE;
public void testSingleton() { System.out.println("testSingleton"); }
}
優勢:
除非必須繼承非 enum 的父類別,否則應優先採用枚舉實作 Singleton。