Из всех паттернов Одиночка имеет самую простую диаграмму классов. Однако несмотря на его простоту в его реализации кроется немало ловушек.
Паттерн Singleton часто называют усовершенствованной глобальной переменной.
Назначение паттерна Singleton
Часто в системе могут существовать сущности только в единственном экземпляре, например, система ведения системного журнала сообщений или драйвер дисплея. К таким объектам можно отнести: пулы программных потоков, кэши, диалоговые окна, драйвера устройств и др. Для таких объектов попытка создать более одного объекта приводит к некорректному поведению программы, к лишним затратам ресурсов или к нелогичным результатам.
В таких случаях необходимо уметь создавать единственный экземпляр некоторого типа, предоставлять к нему доступ извне и запрещать создание нескольких экземпляров того же типа.
Паттерн Singleton предоставляет такие возможности.
Казалось бы, можно воспользоваться глобальной переменной, которая предоставляет глобальную точку доступа к данным.
«Одиночка» избавлен от недостатков глобальной переменной.
Главный из них тот, что если объект присваивается глобальной переменной и как правило вначале программы и объект расходует много ресурсов, а может никогда не использоваться приложением. Паттерн Одиночка позволяет создавать объекты в тот момент, когда они нужны (отложенная инициализация)
В таких случаях необходимо уметь создавать единственный экземпляр некоторого типа, предоставлять к нему доступ извне и запрещать создание нескольких экземпляров того же типа.
Для решения задачи необходимо разбираться в статических методах и переменных, а также в модификаторах доступа.
Паттерн Singleton предоставляет такие возможности.
Описание паттерна Singleton
Архитектура паттерна Singleton основана на идее использования глобальной переменной, имеющей следующие важные свойства:
- Такая переменная доступна всегда. Время жизни глобальной переменной - от запуска программы до ее завершения.
- Предоставляет глобальный доступ, то есть, такая переменная может быть доступна из любой части программы.
- Однако, использовать глобальную переменную некоторого типа непосредственно невозможно, так как существует проблема обеспечения единственности экземпляра, а именно, возможно создание нескольких переменных того же самого типа (например, стековых).