Исключение синглтонов
Я много читал о том, как использование одноэлементных классов становится плохой практикой в программировании из-за скрытых зависимостей, трудно тестировать и т.д. и т.д.
Многие сообщения в форуме, которые я прочитал, говорят, что вы все равно можете поддерживать одну единственную основную функциональность, позволяющую только один экземпляр без использования шаблона singleton.
Я задавался вопросом, может ли кто-нибудь дать практический пример этого. Многие сообщения предложили использовать класс factory для создания экземпляров singleton, где явно отображаются зависимости. Для меня это просто похоже на несколько синглтонов и объединение их в один одиночный сингл factory, который будет иметь те же проблемы?
Ответы
Ответ 1
Проблема с "singleton pattern" на самом деле не с самим синглоном, а с негибким статическим factory методом в одноэлементном классе. И я считаю, что даже в книге GoF это считалось примером того, как можно получить доступ к Singleton, а не к окончательной модели реализации.
Многие сообщения предложили использовать класс factory для создания singleton, где явно показаны зависимости. Мне это просто похоже на то, чтобы взять несколько синглтонов и объединить их в один одиночный сингл factory, который будет иметь те же проблемы?
Разница заключается в том, что этот единственный factory затем становится единственной точкой, в которой вы поддерживаете зависимости.
И на самом деле общепринятым решением является использование инфраструктуры инъекций зависимостей, например Spring или Guice, который в основном представляет собой единственный factory с очень мощным и гибким механизмом конфигурации, который может делать гораздо больше, чем просто управлять одиночными точками.
Ответ 2
Решение, как правило, используется для инъекции зависимостей. Это не значит, что у вас должна быть структура, вам просто нужно создать экземпляры и соединить их вместе с основной базой кода. Я использую модуль, который зависит от всего остального, который прокладывает и конфигурирует все компоненты извне (к компонентам, которые находятся в других модулях).
Используя инъекцию зависимости, у вас есть одноэлемент, когда вы создаете только один экземпляр.
Очевидно, что в тестах вы можете создавать множество экземпляров, включая подклассы и макеты интерфейсов.
Ответ 3
Хорошим практическим примером является весенняя графика. Он создает beans по умолчанию как "singleton" (только один экземпляр в контейнере), но нет требования, чтобы программист реализовал шаблон (частный конструктор, статический метод getInstance и т.д.).