Страница 1 из 1

Шаблон проектирования "Одиночка" (Singleton)

Добавлено: 16 авг 2024, 12:42
ya
Шаблон проектирования "Одиночка" (Singleton) гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Этот шаблон часто используется, когда необходимо контролировать доступ к ресурсам, например, к файлам или базам данных.

singleton.cpp

Код: Выделить всё

#include <iostream>
#include <mutex>

class Singleton {
public:
    // Метод для получения единственного экземпляра класса
    static Singleton& getInstance() {
        static Singleton instance; // Инициализация статического экземпляра
        return instance;
    }

    // Удаляем операции копирования и присваивания
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    void someFunction() {
        std::cout << "Вызов метода someFunction() у Singleton." << std::endl;
    }

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

    ~Singleton() {
        std::cout << "Уничтожен экземпляр Singleton." << std::endl;
    }
};

int main() {
    // Получаем единственный экземпляр класса Singleton
    Singleton& instance1 = Singleton::getInstance();
    instance1.someFunction();

    // Попытка получить еще один экземпляр
    Singleton& instance2 = Singleton::getInstance();
    instance2.someFunction();

    // Проверяем, что это один и тот же экземпляр
    if (&instance1 == &instance2) {
        std::cout << "Оба экземпляра совпадают." << std::endl;
    } else {
        std::cout << "Экземпляры разные." << std::endl;
    }

    return 0;
}
Компиляция и запуск:

Код: Выделить всё

g++ -std=c++11 -o singleton singleton.cpp && ./singleton

Re: Шаблон проектирования "Одиночка" (Singleton)

Добавлено: 08 окт 2024, 12:10
ya

Код: Выделить всё

// Класс одиночки определяет статический метод `getInstance`,
// который позволяет клиентам повторно использовать одно и то же
// подключение к базе данных по всей программе.
class Database is
// Поле для хранения объекта-одиночки должно быть объявлено
// статичным.
private static field instance: Database
// Конструктор одиночки всегда должен оставаться приватным,
// чтобы клиенты не могли самостоятельно создавать
// экземпляры этого класса через оператор `new`.
private constructor Database() is
// Здесь может жить код инициализации подключения к
// серверу баз данных.
// ...
// Основной статический метод одиночки служит альтернативой
// конструктору и является точкой доступа к экземпляру этого
// класса.
public static method getInstance() is
if (Database.instance == null
 null) then
acquireThreadLock() and then
// На всякий случай ещё раз проверим, не был ли
// объект создан другим потоком, пока текущий
// ждал освобождения блокировки.
if (Database.instance == null) null
 then
Database.instance = new Database()
return Database.instance
// Наконец, любой класс одиночки должен иметь какую-то
// полезную функциональность, которую клиенты будут
// запускать через полученный объект одиночки.
public method query(sql) is
// Все запросы к базе данных будут проходить через этот
// метод. Поэтому имеет смысл поместить сюда какую-то
// логику кеширования.
// ...
class Application is
method main() is
Database foo = Database.getInstance()
foo.query("SELECT ...")
// ...
Database bar = Database.getInstance()
bar.query("SELECT ...")
// Переменная "bar" содержит тот же объект, что и
// переменная "foo".