Khái niệm
Singleton là một mẫu thiết kế nhằm hạn chế các instance của một class thành một instance duy nhất, phối hợp hành động trên toàn hệ thống.
Hệ thống hoạt động hiệu quả hơn khi chỉ có một instance tồn tại, hoặc hạn chế các instance đến một số lượng nhất định.
Trong bài viết này, Singleton Pattern được trình bày dưới 2 dạng:
- Singleton đơn giản.
- Singleton với OOP.
Singleton đơn giản
Hiện thực
Tạo class chứa Singleton.
Khai báo class Singleton
.
#ifndef __SINGLETON_H__ #define __SINGLETON_H__ #include <stdio.h> class Singleton { public: static void init(); static void destroy(); static Singleton* getInstance(); void method(); private: static Singleton* m_Instance; Singleton(); ~Singleton(); }; #endif // !__SINGLETON_H__
Trong class Singleton
, ý nghĩa của các phương thức và thuộc tính:
Constructor
vàDestructor
ởprivate
nhằm ngăn việc khởi tạo hoặc hủy instance củaclass Singleton
.- Thuộc tính
m_Instance
có kiểu dữ liệu của chính class đó và mang kiểustatic
. Thuộc tínhm_Instance
là instance đại diện choclass Singleton
. - Phương thức
getInstance
trả về instance đại diện củaclass Singleton
làm_Instance
nhằm đảm bảo tính đóng gói. - Phương thức
init
cấp phát vùng nhớ và thiết lập các thông số cần thiết chom_Instance
. - Phương thức
destroy
thu hồi vùng nhớ đã cấp phát, đồng thời hủy vùng nhớ của các thuộc tính con của Singleton. - Phương tính
method
có thể được gọi ở bất kì vị trí nào trong chương trình thông qua instance của class.
Định nghĩa class Singleton
#include "Singleton.h" Singleton* Singleton::m_Instance = nullptr; Singleton::Singleton() { } Singleton::~Singleton() { } Singleton* Singleton::getInstance() { if (m_Instance == nullptr) Singleton::init(); return m_Instance; } void Singleton::init() { if (m_Instance == nullptr) m_Instance = new Singleton(); } void Singleton::destroy() { if (m_Instance) { delete m_Instance; m_Instance = nullptr; } } void Singleton::method() { printf("This is a singleton method.\n"); }
Cách sử dụng
- Gọi phương thức
method
củaclass Singleton
:Singleton::getInstance()->method();
- Tổng quát:
<Tên class>::getInstance()-><tên phương thức>(...);
Singleton với OOP
Mô hình
Hiện thực
Tạo class Singleton
làm class cơ sở.
#ifndef __SINGLETON_H__ #define __SINGLETON_H__ template <typename T> class Singleton { public: static T* getInstance() { if (m_instance == nullptr) m_instance = new T(); return m_instance; } protected: static T* m_instance; Singleton() {}; ~Singleton() {}; }; template <typename T> T* Singleton<T>::m_instance = nullptr; #endif // !__SINGLETON_H__
Tạo class dẫn xuất từ Singleton.
Tạo class InputManager
kế thừa từ Singleton.
Khai báo class InputManager
.
#ifndef __INPUT_MANAGER_H__ #define __INPUT_MANAGER_H__ #include "Singleton.h" class InputManager { friend class Singleton; private: InputManager(); ~InputManager(); public: bool isKeyDown(int KeyCode); }; #endif // !__INPUT_MANAGER_H__
Định nghĩa class InputManager
.
#include "InputManager.h" InputManager::InputManager() { } InputManager::~InputManager() { } bool InputManager::isKeyDown(int KeyCode) { return true; }