Singleton Pattern là một trong những mẫu thiết kế thuộc nhóm Creational Patterns (mẫu khởi tạo). Mục tiêu của mẫu này là đảm bảo rằng chỉ có một thể hiện (instance) của một lớp tồn tại trong toàn bộ ứng dụng và cung cấp một điểm truy cập toàn cầu đến thể hiện đó.
Mục đích của Singleton Pattern
- Kiểm soát việc khởi tạo: Singleton Pattern đảm bảo rằng chỉ có một đối tượng duy nhất được tạo ra, giúp tránh tình trạng tạo ra nhiều thể hiện không cần thiết.
- Tiết kiệm tài nguyên: Khi một thể hiện duy nhất được sử dụng, nó giúp tiết kiệm bộ nhớ và các tài nguyên khác của hệ thống.
- Truy cập toàn cầu: Cung cấp một cách dễ dàng để truy cập vào đối tượng duy nhất từ bất kỳ đâu trong ứng dụng.
Khi nào nên sử dụng Singleton Pattern?
- Khi bạn cần một đối tượng quản lý tài nguyên chung (ví dụ: kết nối cơ sở dữ liệu, cấu hình ứng dụng).
- Khi bạn muốn đảm bảo rằng một lớp chỉ có một thể hiện và cần điểm truy cập toàn cầu đến đối tượng đó.
- Khi việc tạo nhiều thể hiện sẽ gây ra sự cố hoặc tiêu tốn tài nguyên không cần thiết.
Cách triển khai Singleton Pattern
Dưới đây là một cách triển khai phổ biến của Singleton Pattern trong Java. Triển khai này sử dụng Lazy Initialization để đảm bảo rằng thể hiện chỉ được tạo ra khi nó thực sự cần thiết, và cũng đảm bảo an toàn trong môi trường đa luồng.
Triển khai Singleton Pattern
public class Singleton {
// Biến thể hiện duy nhất
private static Singleton instance;
// Constructor riêng tư để ngăn tạo thể hiện bên ngoài
private Singleton() {
// Khởi tạo các thuộc tính của đối tượng nếu cần
}
// Phương thức để lấy thể hiện duy nhất
public static synchronized Singleton getInstance() {
// Nếu thể hiện chưa được tạo, tạo mới
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// Phương thức khác trong lớp
public void someMethod() {
// Thực hiện một số hành động
System.out.println("Doing something in Singleton!");
}
}
Sử dụng Singleton
public class Main {
public static void main(String[] args) {
// Lấy thể hiện duy nhất của Singleton
Singleton singleton = Singleton.getInstance();
// Gọi phương thức của đối tượng
singleton.someMethod();
}
}
Giải thích chi tiết về triển khai
- Biến thể hiện: Biến tĩnh
instance
được khai báo để lưu trữ thể hiện duy nhất của lớp.
- Constructor riêng tư: Constructor được định nghĩa là riêng tư để ngăn chặn việc tạo thể hiện mới từ bên ngoài lớp.
- Phương thức
getInstance()
: Phương thức này kiểm tra xem thể hiện đã được tạo chưa. Nếu chưa, nó sẽ tạo một thể hiện mới. Phương thức này được đồng bộ hóa (synchronized
) để đảm bảo an toàn khi truy cập từ nhiều luồng.
- Sử dụng: Trong phương thức
main
, bạn có thể lấy thể hiện duy nhất và gọi các phương thức của nó.
Một số lưu ý
- Đảm bảo an toàn trong môi trường đa luồng: Trong trường hợp có nhiều luồng cùng gọi
getInstance()
đồng thời, việc đồng bộ hóa phương thức giúp tránh việc tạo ra nhiều thể hiện.
- Lazy Initialization: Thể hiện chỉ được tạo ra khi thực sự cần thiết, giúp tiết kiệm tài nguyên.
- Kiểm soát Serialization: Nếu lớp Singleton của bạn có thể bị serialize, bạn cần xử lý việc này để đảm bảo rằng một đối tượng duy nhất vẫn được duy trì sau khi deserialization.
Kết luận
Singleton Pattern là một mẫu thiết kế quan trọng trong lập trình hướng đối tượng, giúp kiểm soát việc khởi tạo các thể hiện của một lớp và cung cấp một cách dễ dàng để truy cập vào thể hiện duy nhất đó. Việc sử dụng Singleton Pattern có thể giúp bạn quản lý tài nguyên hiệu quả hơn và duy trì tính nhất quán trong toàn bộ ứng dụng.