Singleton (Đơn Thể)
Định nghĩa
Singleton là một mẫu thiết kế (design pattern) giới hạn việc khởi tạo một lớp chỉ thành một thể hiện (instance) duy nhất. Điều này đảm bảo rằng chỉ có duy nhất một đối tượng của lớp đó tồn tại trong suốt ứng dụng, đồng thời cung cấp một điểm truy cập toàn cục tới đối tượng đó.
Singleton thường được sử dụng trong các kịch bản như quản lý trạng thái trò chơi (Game State), điều khiển âm thanh (Audio), xử lý đầu vào người chơi (Input), hoặc quản lý tài nguyên (Textures, Models), nơi mà việc có nhiều thể hiện có thể dẫn đến mâu thuẫn dữ liệu hoặc lãng phí tài nguyên.
class GameManager {
private static instance: GameManager;
private constructor() { }
public static getInstance(): GameManager {
if (!GameManager.instance) {
GameManager.instance = new GameManager();
}
return GameManager.instance;
}
public startGame(): void {
console.log("Game started");
}
public endGame(): void {
console.log("Game ended");
}
}
GameManager.getInstance().startGame();
Tại sao không dùng trực tiếp Lớp Tĩnh (Static Class)?
Cả Singleton và Lớp Tĩnh đều cung cấp điểm truy cập duy nhất đến các thành phần của chúng, tuy nhiên có những điểm khác biệt quan trọng khiến Singleton là lựa chọn tốt hơn trong nhiều tình huống:
- Quản lý thể hiện (Instance Control): Singleton cho phép linh hoạt hơn vì nó là thể hiện của một lớp, nghĩa là bạn có thể kiểm soát thời điểm tạo và hủy nó. Trong khi đó, các thành phần tĩnh của Lớp Tĩnh sẽ tồn tại trong suốt vòng đời ứng dụng.
- Kế thừa và Đa hình (Inheritance & Polymorphism): Singleton là các lớp bình thường nên có thể kế thừa từ lớp khác hoặc triển khai interface, tận dụng được sức mạnh của lập trình hướng đối tượng (OOP). Lớp tĩnh không thể kế thừa.
- Khởi tạo lười (Lazy Initialization): Singleton có thể được khởi tạo khi thực sự cần dùng đến (lazy). Lớp tĩnh được nạp ngay khi ứng dụng khởi chạy, điều này có thể gây tốn tài nguyên nếu lớp đó chưa bao giờ được dùng.