Одиночка (Singleton)

Метафора

 

Представьте, что Вам нужно организовать в городе телефонную связь. Можно протянуть кабеля от каждого жителя к каждому, но такое решение явно имеет недостаток при добавлении нового жителя, т.к. придётся тянуть от него кабель до всех других. Гораздо дешевле создать в городе телефонную станцию, к которой будет подсоединен каждый житель. Для того чтобы позвонить нужно будет связаться со станцией, а далее станция сделает перенаправление к любому подключенному к ней жителю. Телефонная станция в данном контексте является одиночкой, смысл в том, что когда вы говорите «Мне нужна телефонная станция», вам бы отвечали «Вот она, держи», а не «Давай создадим её заново». Одиночка всегда один.

 

Назначение

 

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

Плюсы:

  • Контролируемый доступ к единственному экземпляру

Недостатки паттерна:

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

 

Диаграмма

 

Одиночка

Одиночка

 

Пример

 

Создание класса напрямую запрещено через CREATE PRIVATE, вместо этого создан метод возвращающий инстанцию класса, причем он проверяет, создан ли уже ранее объект или нет и если создан, возвращает его. Т.к. это статический атрибут, инстанция будет всегда одной в рамках сессии.

Одним из недостатков этого подхода является невозможность замены одиночки в юнит-тестах на объекты заглушки, решить эту проблему поможет несколько расширенная версия:

Основная идея тут вынести поведение одиночки в интерфейс и через публичное свойство (или метод) подменить инстанцию на ту, что нужна для теста.

Кроме перечисленных подходов одиночка может быть представлен как класс с исключительно статическими методами и атрибутами.

  • Илья

    Спасибо за статью!
    Давно уже не писал ничего, думал всё.)

    • Не, точно не все 🙂

  • svirinstel

    Я правильно понимаю, что речь идет о, например, классах-утилитах, у которых нет смысла получения экземпляра:
    «Кроме перечисленных подходов одиночка может быть представлен как класс с исключительно статическими методами и атрибутами.»