Почему внедрение шаблона Singleton в Java-коде (иногда) считается анти-шаблоном в Java-мире?

Я видел некоторых людей в SO, комментируя, что Singleton Pattern является анти-шаблоном. Я хочу знать, почему?

тестирование

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

По этой причине принцип инъекции зависимостей популярен. Каждый class вводится (настраивается) classами, которые им необходимо выполнять (а не выводить через одноэлементные аксессоры), и поэтому тесты могут контролировать, какие экземпляры зависимых classов использовать (и при необходимости предоставлять макеты).

Рамки, такие как Spring, будут управлять жизненным циклом их объектов и часто создавать синглтоны, но эти объекты вводятся в их зависимые объекты каркасом. Таким образом, сама кодовая база не рассматривает объекты как одиночные.

например, вместо этого (например)

public class Portfolio { private Calculator calc = Calculator.getCalculator(); } 

вы бы ввели калькулятор:

 public class Portfolio { public Portfolio(Calculator c) { this.calc = c; } } 

Таким образом, объект Portfolio не знает / заботится о том, сколько экземпляров Calculator существует. Тесты могут вводить фиктивный Calculator который упрощает тестирование.

совпадение

Ограничиваясь одним экземпляром объекта, возможности для streamовой передачи ограничены. Доступ к объекту singleton может быть защищен (например, через синхронизацию). Если вы можете поддерживать несколько экземпляров этих объектов, вы можете настроить количество экземпляров на streamи, которые у вас есть, и увеличить параллельные возможности вашей кодовой базы.

Мое личное мнение заключается в том, что оно нарушает принцип единой ответственности. Объекты Singleton отвечают как за свою цель, так и за контроль над количеством экземпляров, которые они производят, и я думаю, что это неправильно.

Вот почему многие люди делегируют управление фабричному объекту.

[Mutable] Singleton – это анти-шаблон анти-шаблона.

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

На основе этого Singleton добавляет совершенно ненужный уровень сложности, просто объявляя изменяемые static поля.

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

Часто одиночные синглы вообще не являются синглтонами, а «глобальными переменными в маскировке». Кроме того, часто они используются, когда свойство «только один экземпляр» на самом деле не является преимуществом. (что опять-таки уравновешивается тем, что много раз реализация ошибочна в одно и то же время).

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

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

Есть много требований, которые могут возникнуть у синглтона:

  1. ленивая инициализация;
  2. надлежащее удаление;
  3. (по одному на stream, например).

Как правило, у вас также будет много синглонов в вашем приложении, а шаблон Singleton не допускает повторного использования кода. Итак, если вы хотите реализовать все эти проблемы для всех своих синглетов, вы сразу увидите его анти-шаблонное качество.

Странный. Похоже, что некорректная реализация Singleton – это «анти-шаблон», а не сам синглтон.

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

Большинство инфраструктур DI позволяют создавать экземпляр classа как Singleton, он просто обрабатывает это для вас. Если вы сами решите сделать DI, инъекция синглтона не является проблемой. Синглтон также можно тестировать, и если вы используете DI для его инъекции, он не делает class неустойчивым.

IMO, как и любой другой образец (включая DI и IoC), это инструмент. Иногда это подходит, иногда это не так.

  • Получить контекст приложения из classа non activity singleton
  • Есть простой, элегантный способ определения одиночных чисел?
  • Синглтон с аргументами в Java
  • Как реализовать многопоточный безопасный синглтон в C ++ 11 без использования
  • Безопасность streamов в Синглтоне
  • Как создать одноэлементный class в объекте C
  • Реализация Singleton с Enum (на Java)
  • Шаблон для ленивого streamобезопасного создания одноэлементов в java
  • Как создать class singleton
  • Singleton class в java
  • Синглтон: как его использовать
  • Давайте будем гением компьютера.