Можно ли заменить Singleton на Factory? - PullRequest
5 голосов
/ 04 мая 2010

Уже есть несколько постов о Singleton-Pattern, но я хотел бы начать еще один на эту тему, так как я хотел бы знать, будет ли Factory-Pattern правильным подходом для удаления этого "анти-паттерна ».

В прошлом я довольно часто пользовался синглтоном, также как и мои коллеги-коллеги, потому что им очень легко пользоваться. Например, Eclipse IDE или, что лучше, его верстак-модель также активно использует синглтоны. Именно из-за некоторых постов о E4 (следующей большой версии Eclipse) я начал переосмысливать синглтон.

Суть в том, что благодаря этим синглетонам зависимости в Eclipse 3.x тесно связаны.

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

  • скрыть сложность
  • меньше сцепления
  • У меня есть контроль над тем, сколько экземпляры созданы (просто сохраните ссылка я частное поле завод)
  • макет фабрики для тестирования (с Dependency Injection) когда он находится за интерфейсом
  • В некоторых случаях фабрики могут производить более одного синглтона устарели (в зависимости от бизнеса логическая / компонентная композиция)

Имеет ли это смысл? Если нет, пожалуйста, дайте веские причины, почему вы так думаете. Также приветствуется альтернативное решение.

Спасибо

Марк

Ответы [ 6 ]

9 голосов
/ 04 мая 2010

Я согласен, что это иногда дает смысл. Однако это зависит от того, что вы строите.

Если вы заменяете каждый отдельный синглтон на фабрику только потому, что он «лучше», вы делаете это неправильно imho. Это должно служить цели. Если вы не собираетесь издеваться, если вы уверены, что вам нужен только один экземпляр и т. Д., Тогда замена - это просто "архитектурная мастурбация";)

Не поймите меня неправильно, архитектура очень важна, но вы не должны переусердствовать.

4 голосов
/ 04 мая 2010

На мой взгляд, основным недостатком синглетонов является тесная связь (со всеми вытекающими последствиями, такими как дерьмовое тестирование и т. Д.).

Заводская модель допускает гораздо более слабую степень связи, поэтому да: замена синглетонов на фабрики звучит как хорошая идея.

Как упоминает Питер Келли , фабрики иногда могут оказаться синглетонами. Тем не менее, фабрики, по крайней мере, не возвращают экземпляр себя, а скорее экземпляр некоторой реализации интерфейса, и это огромный плюс.

3 голосов
/ 04 мая 2010

В моем понимании вы не можете "заменить" Синглтон на Фабрику, но вы можете использовать эти шаблоны вместе. Фабрика вернет экземпляр объекта вызывающей стороне метода Фабрика. Если вы хотите убедиться, что есть только один экземпляр конкретного объекта, который возвращает Factory, тогда этот объект должен быть Singleton. Вы прячете синглтон на фабрике.

Если вы храните частный экземпляр объекта на Фабрике, а не в самом объекте - тогда как вы можете обеспечить, чтобы в системе был только один экземпляр объекта? Как вы можете заставить этот объект только когда-либо создаваться вашей Фабрикой?

Вы можете заменить синглтон на IoC, и, действительно, кажется, что синглтон как анти-паттерн вызывает массу плохих чувств, и даже Гамма сказал, что хотел бы, чтобы он оставил его вне книги GoF ...

2 голосов
/ 04 мая 2010

Фабрика, безусловно, является альтернативой синглтону, и я бы предпочел первое, а не второе. Синглтоны очень сложно тестировать и приводят к сильной связи. Фабрики, если они правильно реализованы (с использованием чистых интерфейсов и т. Д.), Приводят к более тестируемому коду и меньшей связности.

Тем не менее, это не значит, что вы должны использовать фабрики в качестве кувалды для каждой проблемы. Существуют и другие схемы, которые также могут привести к меньшей связности, чем синглтон, но могут быть более подходящим решением. Например: инверсия управления.

1 голос
/ 04 мая 2010

Синглтон, конечно, антипаттерн. И если вы используете TDD - вы должны избегать таких решений. Любой IoC Framework, такой как Windsor или Unity, может эмулировать эту функциональность для вас без ужасных статических классов. Однако, если вы не используете TDD и ваш проект довольно прост, вы можете использовать его. Кстати, я бы порекомендовал IoC Framework, а не самодельные фабрики. Не изобретай колесо.

1 голос
/ 04 мая 2010

Синглтоны, как описано в схеме проектирования, обычно используют статические переменные, что затрудняет тестирование кода.

Я бы рекомендовал прочитать это от Мишко Хевери и две последующие статьи 1 и 2 . Здесь он описывает разницу между объектом с одним экземпляром и объектом Singleton, как в шаблоне проектирования, и что предпочтение следует отдавать первому.

Так что, по моему мнению, ваш описанный подход был бы подходящим вариантом.

...