Это шаблон проектирования, который гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Существует несколько способов реализации Singleton, включая ленивую инициализацию, использование
static и многопоточную безопасность.🚩Основные методы реализации
🟠Ленивая инициализация (Lazy Initialization)
При ленивой инициализации объект создается только при первом обращении к нему.
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
// Удаляем конструкторы копирования и присваивания
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {} // Приватный конструктор
};🟠Инициализация при запуске (Eager Initialization)
При инициализации при запуске объект создается сразу при загрузке программы.
class Singleton {
public:
static Singleton& getInstance() {
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
static Singleton instance; // Статический экземпляр
};
Singleton Singleton::instance;🟠Многопоточная безопасность (Thread-safe Singleton)
Используя
std::call_once и std::once_flag, можно обеспечить безопасность при доступе из нескольких потоков.#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initInstanceFlag, &Singleton::initSingleton);
return *instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
static void initSingleton() {
instance = new Singleton();
}
static Singleton* instance;
static std::once_flag initInstanceFlag;
};
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;
🚩Плюсы
➕Ленивая инициализация
Экономит ресурсы, так как объект создается только при необходимости.
➕Инициализация при запуске
Простая реализация, не требует дополнительных проверок, но объект создается даже если не используется.
➕Многопоточная безопасность
Обеспечивает корректное создание объекта в многопоточной среде, но сложнее в реализации.
Ставь 👍 и забирай 📚 Базу знаний