Trong quá trình phân tích thiết kế một hệ thống, có những đối tượng cần tồn tại duy nhất song có thể truy xuất mọi lúc mọi nơi. Làm thế nào để hiện thực được một đối tượng như thế khi xây dựng mã nguồn?
Sử dụng biến toàn cục chỉ có thể đáp ứng được mặt “sử dụng mọi lúc mọi nơi”, khi xét tính duy nhất của thể hiện thì biến toàn cục không làm được điều đó.
Singleton pattern là một mẫu thiết kế đáp ứng được cả hai yêu cầu trên.
Design Pattern
Mẫu thiết kế là một mô tả được áp dụng linh hoạt nhằm giải quyết một vấn đề trong nhiều tình huống thiết kế phần mềm cụ thể.
Singleton Pattern
Khái niệm và đặc điểm
Mục đích của singleton pattern:
- Xây dựng các lớp Singleton mà mỗi class chỉ có duy nhất một thể hiện.
- Có thể truy xuất được các thể hiện duy nhất đó mọi lúc mọi nơi trong chương trình.
Hiện thực
Khi hiện thực singleton pattern phải đảm bảo rằng chỉ có một thể hiện (instance) duy nhất được tạo ra và thể hiện tại có thể dùng mọi lúc mọi nơi. Khi xây dựng class cần một kỹ thuật để có thể truy xuất được vào các thành viên public của class mà không tạo ra một thể hiện nào (thông qua việc khởi tạo bên ngoài class).
Để chắc chắn không có bất kỳ thể hiện nào bên ngoài class được tạo ra, constructor của class đó sẽ có phạm vi truy cập là private, nghĩa là thể hiện duy nhất được tạo ra thông qua chính class được xây dựng. Sử dụng thành phần static để thực hiện điều này. Tạo một thể hiện của lớp kiểu private static và một refractor trả về đối tượng thuộc chính lớp đó.
Trong C++, singleton định nghĩa một thuộc tính static là một con trỏ trỏ tới thể hiện duy nhất của class đó.
Mô hình

Mã nguồn
Khai báo lớp Singleton
#include <iostream> using namespace std; class Singleton { private: static Singleton* m_instance; Singleton(); public: static Singleton* getInstance(); void method(); };
Định nghĩa lớp Singleton
#include "Singleton.h" // Init static instance Singleton* Singleton::m_instance = NULL; Singleton* Singleton::getInstance() { if (m_instance == NULL) { m_instance = new Singleton(); } return m_instance; } void Singleton::method() { cout << "This is singleton parttern"; }
Như vậy, thông qua các truy cập Singleton::getInstance()
, luôn có một đối tượng duy nhất, đồng thời có thể sử dụng nó để truy cập mọi thành phần public trong class.
Ví dụ để gọi phương thức method trong class, sử dụng Singleton::getInstance()->method()
.