1. Singleton class trong Java là gì?
Trong Java, singleton là một design pattern để đảm bảo rằng một lớp chỉ có thể tạo ra duy nhất một đối tượng.
Design pattern là các giải pháp tổng thể đã được tối ưu hóa, được tái sử dụng cho các vấn đề phổ biến trong lập trình mà các lập trình viên thường gặp.
Để tạo ra một lớp singleton, một lớp phải có các thành viên như sau:
- Tạo một hàm khởi tạo private để ngăn chặn việc tạo một đối tượng bên ngoài lớp
- Tạo một thuộc tính private có kiểu chính là lớp singleton đó. Đây chính là đối tượng duy nhất được tạo ra của lớp singleton
- Tạo ra một phương thức public static để cho phép tạo ra và truy cập đối tượng duy nhất được tạo ra của lớp singleton. Bên trong phương thức này, chúng ta sẽ cài đặt để ngăn chăn tạo ra nhiều hơn một đối tượng của lớp singleton.
Cú pháp của một singleton class như sau:
class SingletonClass {
//thuộc tính private có kiểu chính là SingletonClass
private static SingletonClass singleObject;
private SingletonClass() {
//hàm khởi tạo private của lớp SingletonClass
}
public static SingletonClass getInstance() {
//cài đặt để chỉ cho phép tạo ra một đối tượng của lớp SingletonClass
//truy cập đối tượng của SingletonClass nếu cần
}
}
2. Sử dụng singleton class trong Java
Singleton có thể được sử dụng để làm việc với database. Chúng ta có thể tạo một đối tượng duy nhất để đảm nhận nhiệm vụ kết nối và thao tác với database. Ví dụ:
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {
//tạo ra đối tượng nếu đối tượng chưa được tạo
if(dbObject == null) {
dbObject = new Database();
}
//return đối tượng của lớp Database
return dbObject;
}
public void getConnection() {
System.out.println("You are now connected to the database.");
}
}
class Main {
public static void main(String[] args) {
//khai báo đối tượng mà không thể khởi tạo
//bởi vì hàm khởi tạo được khai báo private
Database db1;
//lấy đối tượng duy nhất của lớp Database
db1= Database.getInstance();
db1.getConnection();
}
}
Kết quả
You are now connected to the database.
Trong ví dụ trên, chúng ta tạo ra một singleton class Database. Đối tượng dbObject là đối tượng duy nhất được tạo ra trong lớp Database. Đối tượng dbObject là một thuộc tính của lớp Database.
Hàm khởi tạo Database()
có access modifier là private để ngăn chặn việc tạo đối tượng của Database bên ngoài lớp.
Phương thức public static getInstance()
trả về đối tượng dbObject duy nhất của lớp Database.
Trong lớp Main, chúng ta tạo một biến db1 có kiểu là Database. Chúng ta gọi hàm getInstance()
để gán đối tượng duy nhất của Database cho db1.