Согласно GoF, паттерн «Одиночка» гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. В книге «Паттерны проектирования» дается такое же объяснение. Одиночки часто используются в сочетании с фабриками.
Одиночки, как правило, используются в следующих целях и случаях:
- для получения доступа к совместно используемым данным, таким как конфигурационные данные, повсюду в контексте приложения;
- чтобы улучшать производительность, загружать и кэшировать дорогостоящие ресурсы только один раз, разрешая глобальный совместный доступ;
- для создания экземпляра регистратора для приложения, поскольку обычно необходим только один регистратор;
- для управления объектами внутри класса, реализующего паттерн «Фабрика»;
- для создания объекта «Фасад» так как обычно требуется только один такой объект;
- для отложенного создания статических классов, поскольку одиночки могут быть инициализированы отложенно.
Spring использует одиночек при создании компонентов (по умолчанию компоненты Spring-одиночки), платформа jаvа ЕЕ применяет одиночек внутренним образом, как, например, в локаторе сервисов. Платформа Jаvа EE также использует паттерн «Одиночка» в реализации runtime класса. Так что одиночки определенно полезны, если вы используете их в правильной ситуации.
Тем не менее интенсивное применение паттерна «Одиночка» может означать ненужное кэширование ресурсов и препятствование возвращению сборщиком мусора объектов в пользование и освобождению им ценных ресурсов памяти. Оно также может означать. что вы на самом деле не используете выгоды от создания объектов и наследования.
Необычно интенсивное применение одиночек считается признаком плохого объектно-ориентированного проектирования приложения, что может привести к проблемам с памятью и производительностью. Другая проблема — одиночки не очень хорошо себя проявляют при поблочном тестировании приложения. Проблемы, сопровождающие использование паттерна «Одиночка», будут детальнее обсуждаться дальше в наших постах.