Singleton đảm bảo một lớp chỉ có đúng một thể hiện (instance) trong toàn ứng dụng và cung cấp một điểm truy cập toàn cục tới nó. Thường dùng cho tài nguyên dùng chung: config, logger, connection pool, cache.
Cách làm điển hình: constructor private + một biến static giữ instance + phương thức getInstance() tạo lười (lazy) khi cần lần đầu.
Nhược điểm (hay bị hỏi):
- Thực chất là global state → khó test (khó mock/inject), che giấu phụ thuộc, dễ gây coupling ngầm.
- Không an toàn đa luồng nếu khởi tạo lười mà không đồng bộ (cần double-checked locking hoặc eager init).
- Vi phạm Single Responsibility (vừa lo nghiệp vụ vừa lo vòng đời của chính nó).
Thay thế hiện đại: dùng dependency injection với scope singleton do container quản lý → giữ được "một instance" nhưng dễ test hơn.