December 12, 2020

Синглтон

Шаблон проектирования или паттерн — это повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

В этой статье мы рассмотрим один из шаблонов проектирования, который называется Синглтон или Одиночка.

Определение

Синглтон — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

Из определения следует, что данный паттерн решает сразу две проблемы:

  • Гарантирует наличие единственного экземпляра класса. То есть нельзя будет создать несколько экземпляров класса.
  • Предоставляет глобальную точку доступа. То есть можно в любом месте программы получить экземпляр этого класса.

Реализация

Создадим класс, в котором будет приватное поле, которое будет сохранять единственный экземпляр этого класса. Добавим публичный статический метод, который будет возвращать экземпляр класса. Конструкторы класса сделаем приватными. Вот что получится:

class Singleton {
private:
    static Singleton * p_instance;
    // Конструкторы и оператор присваивания недоступны клиентам
    Singleton() {}
    Singleton( const Singleton& );
    Singleton& operator=( Singleton& );
public :
    static Singleton * getInstance() {
        if(!p_instance)  
            p_instance = new Singleton();
        return p_instance;
    }
};
 
Singleton* Singleton::p_instance = nullptr;

Теперь, для того чтобы использовать этот класс, мы вызовем метод getInstance(), который вернет нам единственный экземпляр класса Singleton:

Singleton* s = Singleton::getInstance();

Применимость

  • Когда в программе должен быть единственный экземпляр какого-то класса, доступный всем клиентам (например, общий доступ к базе данных из разных частей программы). Синглтон скрывает от клиентов все способы создания нового объекта, кроме специального метода. Этот метод либо создаёт объект, либо отдаёт существующий объект, если он уже был создан.
  • Когда вам хочется иметь больше контроля над глобальными переменными. В отличие от глобальных переменных, Синглтон гарантирует, что никакой другой код не заменит созданный экземпляр класса, поэтому вы всегда уверены в наличии лишь одного объекта-одиночки.Тем не менее, в любой момент вы можете расширить это ограничение и позволить любое количество объектов-одиночек, поменяв код в одном месте (метод getInstance).

Преимущества

  • Гарантирует наличие единственного экземпляра класса.
  • Предоставляет к нему глобальную точку доступа.
  • Реализует отложенную инициализацию объекта-одиночки.

Недостатки

  • Нарушает принцип единственной ответственности класса. Это означает, что каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс.
  • В некоторых случаях маскирует плохой дизайн и архитектуру.
  • Могут возникнуть проблемы в многопоточных приложениях.