Search…

Design Pattern: Singleton Pattern

15/09/20202 min read
Tìm hiểu và hiện thực Singleton Pattern hỗ trợ kế thừa.

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:

  • ConstructorDestructorprivate nhằm ngăn việc khởi tạo hoặc hủy instance của class Singleton.
  • Thuộc tính m_Instance có kiểu dữ liệu của chính class đó và mang kiểu static. Thuộc tính m_Instance là instance đại diện cho class Singleton.
  • Phương thức getInstance trả về instance đại diện của class Singletonm_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 cho m_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ủa class 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

Mô hình singleton pattern với OOP

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;
}
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024