printПорождающие паттерны

printОдиночка

Singleton

Назначение
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

Результаты
1. Класс Singleton инкапсулирует свой единственный экземпляр, он полностью контролирует то, как и когда клиенты получают доступ к нему.
2. Паттерн одиночка позволяет избежать засорения пространства имен глобальными переменными, в которых хранятся уникальные экземпляры.
3. От класса Singleton можно порождать подклассы, а во время выполнения создавать экземпляр класса, заданного в конфигурации.
4. Паттерн позволяет использовать и более одного экземпляра класса Singleton. Для этого нужно изменить операцию доступа к экземпляру класса.

Структура
14675.png
Реализация
// Интерфейс класса
class Singleton {
  int data; // какие-то данные
  static Singleton *s;
  // Создавать объекты могут только методы этого класса
  Singleton(int d):data(d){}
  // Запрещение создания копий и присваивания
  Singleton(const Singleton &)=delete;
  Singleton& operator=(const Singleton &)=delete;
public:
  // Метод для доступа к единственному экземпляру
  static Singleton *Instance();
  ~Singleton() { s=NULL; }
  // метод для доступа к данным
  int getdata() const { return data; }
};
// Реализация класса
Singleton *Singleton::s=NULL;
Singleton *Singleton::Instance()
{ if(!s) 
    s=new Singleton(1);
  return s;
}
// Обращение к объекту в клиенте
int d=Singleton::Instance()->getdata();
Вариант реализации паттерна без возможности удаления клиентом экземпляра.
// Интерфейс класса
class Singleton {
  int data; // какие-то данные
  // Создавать объекты могут только методы этого класса
  Singleton(int d):data(d){}
  // Запрещение создания копий и присваивания
  Singleton(const Singleton &)=delete;
  Singleton& operator=(const Singleton &)=delete;
  ~Singleton() {}
public:
  // Метод для доступа к единственному экземпляру
  static Singleton &Instance();
  // метод для доступа к данным
  int getdata() const { return data; }
};
// Реализация класса
Singleton &Singleton::Instance()
{ // Собственные объекты функции создаются только один раз
  // при первом вызове этой функции
  static Singleton s(1); 
  return s;
}
// Обращение к объекту в клиенте
int d=Singleton::Instance().getdata();
loading