Подтвердить что ты не робот

Исключение синглтонов

Я много читал о том, как использование одноэлементных классов становится плохой практикой в ​​программировании из-за скрытых зависимостей, трудно тестировать и т.д. и т.д.

Многие сообщения в форуме, которые я прочитал, говорят, что вы все равно можете поддерживать одну единственную основную функциональность, позволяющую только один экземпляр без использования шаблона singleton.

Я задавался вопросом, может ли кто-нибудь дать практический пример этого. Многие сообщения предложили использовать класс factory для создания экземпляров singleton, где явно отображаются зависимости. Для меня это просто похоже на несколько синглтонов и объединение их в один одиночный сингл factory, который будет иметь те же проблемы?

4b9b3361

Ответ 1

Проблема с "singleton pattern" на самом деле не с самим синглоном, а с негибким статическим factory методом в одноэлементном классе. И я считаю, что даже в книге GoF это считалось примером того, как можно получить доступ к Singleton, а не к окончательной модели реализации.

Многие сообщения предложили использовать класс factory для создания singleton, где явно показаны зависимости. Мне это просто похоже на то, чтобы взять несколько синглтонов и объединить их в один одиночный сингл factory, который будет иметь те же проблемы?

Разница заключается в том, что этот единственный factory затем становится единственной точкой, в которой вы поддерживаете зависимости.

И на самом деле общепринятым решением является использование инфраструктуры инъекций зависимостей, например Spring или Guice, который в основном представляет собой единственный factory с очень мощным и гибким механизмом конфигурации, который может делать гораздо больше, чем просто управлять одиночными точками.

Ответ 2

Решение, как правило, используется для инъекции зависимостей. Это не значит, что у вас должна быть структура, вам просто нужно создать экземпляры и соединить их вместе с основной базой кода. Я использую модуль, который зависит от всего остального, который прокладывает и конфигурирует все компоненты извне (к компонентам, которые находятся в других модулях).

Используя инъекцию зависимости, у вас есть одноэлемент, когда вы создаете только один экземпляр.

Очевидно, что в тестах вы можете создавать множество экземпляров, включая подклассы и макеты интерфейсов.

Ответ 3

Хорошим практическим примером является весенняя графика. Он создает beans по умолчанию как "singleton" (только один экземпляр в контейнере), но нет требования, чтобы программист реализовал шаблон (частный конструктор, статический метод getInstance и т.д.).