cpp

Шаблон проектирования Singleton

Иногда возникает необходимость ограничить количество создаваемых экземпляров класса. Например, при создании класса с настройками приложения достаточно иметь только один экземпляр класса. Создание других экземпляров приведет к дублированию настроек, к напрасной трате ресурсов и даже к ошибкам. Чтобы иметь возможность создать только один экземпляр класса можно воспользоваться шаблоном проектирования Singleton (одиночка) (листинг 13.37).

Листинг 13.37. Шаблон проектирования Singleton

#include <iostream>

class Singleton {
public:
   static Singleton &instance() {
      static Singleton obj;
      return obj;
   }
   void setX(int x) { x_ = x; }
   int getX() const { return x_; }

   Singleton(const Singleton &) = delete;
   Singleton &operator=(const Singleton &) = delete;
private:
   Singleton() {}
   ~Singleton() {}
private:
   int x_ = 10;
};

int main() {
   Singleton &s1 = Singleton::instance();
   Singleton &s2 = Singleton::instance();
   std::cout << s1.getX() << std::endl;                    // 10
   s2.setX(20);
   std::cout << s1.getX() << std::endl;                    // 20
   std::cout << s2.getX() << std::endl;                    // 20
   std::cout << Singleton::instance().getX() << std::endl; // 20
   return 0;
}

Обратите внимание: в классе Singleton конструктор по умолчанию является закрытым, поэтому создать экземпляр класса явным образом нельзя. Кроме того, с помощью спецификатора delete запрещено использование конструктора копирования и оператора присваивания. Это нужно для предотвращения создания копии объекта. Создать экземпляр класса можно только с помощью статического метода instance(), который возвращает ссылку на объект. Причем, благодаря статической локальной переменной, экземпляр класса Singleton создается только при первом вызове метода instance(). Все последующие вызовы метода instance() будут возвращать ссылку на созданный ранее объект. Таким образом, объект всегда будет существовать только в единственном экземпляре.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp