Как реализовать и использовать паттерн проектирования Singleton в C++?

Паттерн проектирования Singleton обеспечивает создание одного единственного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру. Вот как можно реализовать и использовать паттерн Singleton в языке C++:

Реализация паттерна Singleton

  1. Скрытый конструктор: Конструктор класса должен быть приватным или защищенным, чтобы предотвратить создание объектов извне.
  2. Удаленные копирующие конструкторы: Запретите копирование и присваивание объектов, чтобы гарантировать, что только один экземпляр будет создан.
  3. Статическая функция-член: Статическая функция-член возвращает указатель на единственный экземпляр класса.
  4. Статический экземпляр: Экземпляр класса должен быть создан как статический член.

Пример кода:

#include <iostream>
#include <mutex>

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;

    // Приватный конструктор
    Singleton() {
        std::cout << "Создание экземпляра Singleton" << std::endl;
    }

    // Удаленные копирующий конструктор и оператор присваивания
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    // Статическая функция, возвращающая единственный экземпляр
    static Singleton* getInstance() {
        std::lock_guard<std::mutex> lock(mtx); // Блокировка для обеспечения потокобезопасности
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void doSomething() {
        std::cout << "Метод doSomething вызван" << std::endl;
    }
};

// Инициализация статических членов класса
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

int main() {
    // Получение единственного экземпляра Singleton
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();

    // Проверка, что экземпляры одинаковы
    if (s1 == s2) {
        std::cout << "Оба указателя указывают на один и тот же экземпляр" << std::endl;
    }

    // Вызов метода doSomething
    s1->doSomething();

    return 0;
}

Объяснение кода

  1. Приватный конструктор:
  • Конструктор класса Singleton объявлен как приватный, чтобы запретить создание объектов извне.
  1. Удаленные копирующие конструкторы:
  • Копирующий конструктор и оператор присваивания объявлены как удаленные (= delete), чтобы предотвратить копирование и присваивание объектов.
  1. Статическая функция-член:
  • Функция getInstance() возвращает указатель на единственный экземпляр класса. Она использует блокировку (std::lock_guard), чтобы обеспечить потокобезопасность.
  1. Статический экземпляр:
  • Экземпляр класса Singleton и объект std::mutex объявлены как статические члены.
  1. Использование Singleton:
  • В функции main() вызывается getInstance() для получения единственного экземпляра класса. Оба указателя s1 и s2 указывают на один и тот же объект, что подтверждает правильную работу паттерна Singleton.

Преимущества паттерна Singleton

  1. Контроль доступа:
  • Паттерн Singleton гарантирует, что существует только один экземпляр класса, и предоставляет глобальную точку доступа к нему.
  1. Экономия ресурсов:
  • Позволяет избежать многократного создания объекта, что может быть особенно полезно для ресурсоемких объектов.
  1. Гарантия инициализации:
  • Паттерн Singleton обеспечивает правильную инициализацию объекта и предотвращает создание его копий.

Заключение

Паттерн Singleton — это эффективный способ управления доступом к единственному экземпляру класса в приложении. Он помогает контролировать инициализацию, экономить ресурсы и обеспечивать глобальную точку доступа к объекту.

Закладка Постоянная ссылка.

Обсуждение закрыто.