
Đảm bảo một class chỉ có duy nhất một instance được khởi tạo và nó cung cấp phương thức truy cập đến instance đó từ mọi nơi (global access).
Reference:
class Singleton {
static _instance = null; // Private instance variable
constructor() {
if (Singleton._instance) {
throw new Error("This class is a Singleton!");
}
Singleton._instance = this;
}
static getInstance() {
if (!Singleton._instance) {
new Singleton(); // Create the instance if it doesn't exist
}
return Singleton._instance;
}
}
// Usage
const obj1 = Singleton.getInstance();
const obj2 = Singleton.getInstance();
console.log(obj1 === obj2); // Output: true (same instance)
Ưu điểm:
- Chắc chắn chỉ có một instance (khởi tạo) trong 1 class: Singleton pattern đảm bảo rằng chỉ có duy nhất một instance của một lớp được tạo ra và sử dụng trong toàn bộ ứng dụng.
- Truy cập toàn cục: Instance của class đó phải được truy cập từ mọi nơi trong ứng dụng, cung cấp sự thuận tiện và linh hoạt trong việc chia sẻ dữ liệu hoặc chức năng.
- Init lazy (lazy initialization): Instance chỉ được tạo ra khi cần thiết, giúp tối ưu hóa tài nguyên.
Ví dụ: có thể phát nhạc ở ngoài nàm hình và dừng lại dựa vào một button ▶️, nhưng khi vô trong setting app-music đó để tắt cũng phải sử dụng ▶️ để tắt / mở, 2 nút đó phải được sử dụng 1 instance để hoạt động.
Nhược điểm:
- Vi phạm nguyên tắc Single Responsibility Principle (SRP): Singleton pattern có thể làm mất đi tính độc lập và tách biệt của các thành phần trong hệ thống.
- Không có chức năng nào để phát hành lớp Singleton một cách rõ ràng hoặc bạn cần tự tạo nó vào thời điểm thích hợp. (dịch từ tiếng Nhật)
- Khó kiểm thử (difficult to test): Việc kiểm thử các phần của code sử dụng Singleton có thể gặp khó khăn do khả năng truy cập toàn cục của nó. (Sự phụ thuộc và trạng thái giữa các lớp thoạt nhìn không rõ ràng, khiến việc suy ra chúng từ mã trở nên khó khăn - dịch từ tiếng Nhật)