Ликвидация одиночных - PullRequest
       20

Ликвидация одиночных

12 голосов
/ 06 февраля 2012

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

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

Интересно, кто-нибудь может привести практический пример этого?Во многих публикациях предлагается использовать фабричный класс для создания одноэлементных экземпляров, в которых четко показаны зависимости.Мне просто кажется, что нужно взять несколько синглетонов и объединить их в один заводской синглтон, который будет иметь те же проблемы?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Проблема с «одноэлементным шаблоном» на самом деле связана не с самим одноэлементным шаблоном, а с негибким статическим фабричным методом в одноэлементном классе . И я считаю, что даже в книге GoF это считалось примером того, как можно получить доступ к одиночке, а не моделью окончательной реализации.

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

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

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

1 голос
/ 06 февраля 2012

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

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

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

0 голосов
/ 06 февраля 2012

Хороший практический пример - пружинная рама. По умолчанию он создает bean-компоненты как «singleton» (только один экземпляр в контейнере), но не требуется, чтобы программист реализовывал шаблон (закрытый конструктор, статический метод getInstance и т. Д.).

...