Singleton Pattern
Đảm bảo một class chỉ có một instance duy nhất trong toàn ứng dụng, cung cấp điểm truy cập toàn cục (global access point).
Cách phổ biến: Eager Initialization (Static Block)
public class SingletonEager {
// 1. Static instance tạo ngay khi load class
private static final SingletonEager INSTANCE = new SingletonEager();
// 2. Private constructor ngăn new từ bên ngoài
private SingletonEager() {}
// 3. Public static method trả về instance
public static SingletonEager getInstance() {
return INSTANCE;
}
public void doSomething() {
System.out.println("Singleton instance working...");
}
public static void main(String[] args) {
SingletonEager s = SingletonEager.getInstance();
s.doSomething();
}
}
Kết quả
Singleton instance working...
Các biến thể khác
| Cách | Đặc điểm |
|---|---|
| Eager (static field/block) | Đơn giản, thread-safe, tạo sớm (có thể lãng phí nếu không dùng) |
| Lazy (double-checked locking) | Tạo khi cần, phức tạp, cần volatile + synchronized |
| Bill Pugh (Inner static class) | Lazy, thread-safe, đơn giản, khuyến khích |
| Enum Singleton | Ngắn gọn, thread-safe, chống serialization/reflection attack |
Enum Singleton (Best Practice hiện đại)
public enum SingletonEnum {
INSTANCE;
public void doSomething() { System.out.println("Enum Singleton"); }
}
// Dùng: SingletonEnum.INSTANCE.doSomething();
Khuyến nghị: Dùng enum cho Singleton trong Java ≥ 5. An toàn, ngắn gọn, tự xử lý serialization.