Ví dụ về Singleton Pattern trong C++
Bài viết này giới thiệu về Singleton Pattern trong C++, bao gồm cách triển khai và ứng dụng của nó trong việc quản lý đối tượng. Singleton Pattern đảm bảo rằng một lớp chỉ có một thể hiện duy nhất và cung cấp một điểm truy cập toàn cục cho nó.
Singleton Pattern là một trong những mẫu thiết kế phổ biến nhất trong lập trình hướng đối tượng. Mẫu này đảm bảo rằng một lớp chỉ có một thể hiện duy nhất và cung cấp một phương thức để truy cập đối tượng đó. Bài viết này sẽ trình bày cách triển khai Singleton Pattern trong C++ với ví dụ cụ thể.
Mã C++
#include <iostream>
#include <mutex>
class Singleton {
private:
static Singleton* instance; // Con trỏ tới thể hiện duy nhất
static std::mutex mtx; // Mutex để đảm bảo an toàn trong đa luồng
// Constructor riêng tư
Singleton() {
std::cout << "Constructor gọi" << std::endl;
}
public:
// Phương thức để truy cập thể hiện duy nhất
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx); // Đảm bảo an toàn cho đa luồng
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
// Phương thức mẫu
void someBusinessLogic() {
std::cout << "Xử lý logic kinh doanh" << std::endl;
}
};
// Khởi tạo giá trị con trỏ
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
int main() {
// Lấy thể hiện của Singleton và thực hiện một số logic
Singleton* singleton = Singleton::getInstance();
singleton->someBusinessLogic();
return 0;
}
Giải thích chi tiết từng dòng code
static Singleton* instance
: Con trỏ tĩnh giữ thể hiện duy nhất của lớp Singleton.static std::mutex mtx
: Mutex để đảm bảo rằng các luồng không truy cập đồng thời vào phương thứcgetInstance()
.Singleton()
: Constructor riêng tư để ngăn không cho đối tượng được tạo bên ngoài lớp.static Singleton* getInstance()
: Phương thức tĩnh để truy cập thể hiện duy nhất. Kiểm tra xem thể hiện đã được tạo hay chưa và tạo nếu cần.std::lock_guard<std::mutex> lock(mtx)
: Đảm bảo an toàn trong môi trường đa luồng khi kiểm tra và tạo thể hiện.someBusinessLogic()
: Một phương thức ví dụ trong lớp Singleton.
Yêu cầu hệ thống:
- C++11 trở lên (để sử dụng
std::mutex
vàstd::lock_guard
)
Cách cài đặt các thư viện để chạy được đoạn mã C++ trên:
Đoạn mã trên không yêu cầu thư viện bên ngoài nào. Bạn chỉ cần biên dịch bằng trình biên dịch hỗ trợ C++11.
Lời khuyên:
- Singleton Pattern rất hữu ích khi bạn cần một đối tượng duy nhất, như một trình quản lý kết nối cơ sở dữ liệu hoặc một cấu hình toàn cục.
- Hãy cẩn thận khi sử dụng Singleton trong môi trường đa luồng để tránh các vấn đề về an toàn dữ liệu.