Почему внедрение шаблона 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), это инструмент. Иногда это подходит, иногда это не так.

  • Зачем использовать синглтон вместо статических методов?
  • Каков эффективный способ реализации одноэлементного шаблона в Java?
  • Что альтернатива синглтон
  • Java Singleton и синхронизация
  • О шаблонах проектирования: когда следует использовать синглтон?
  • C ++ singleton против глобального статического объекта
  • Синглтон, поясняющий Джон Скит
  • Есть простой, элегантный способ определения одиночных чисел?
  • Что так плохо о одиночных играх?
  • Синглтон с аргументами в Java
  • Каким образом реализация Майерсом Синглтона на самом деле является синглтон
  • Interesting Posts

    Как управлять уровнем громкости системы на OS X с помощью клавиатуры без средств массовой информации?

    Сокращения параллельно в логарифмическом времени

    Где я могу настроить поведение текста по умолчанию в Windows?

    Как передать C-структуры обратно и обратно на Java-код в JNI?

    Почему моя Git repo вошла в отдельное состояние HEAD?

    КлассNotFoundException / NoClassDefFoundError в моем веб-приложении Java

    Windows 7 совместно использует интернет-соединение с несколькими сетевыми интерфейсами

    Как исправить поврежденные HDFS

    Как настроить SSH, поэтому мне не нужно вводить пароль?

    Попытка удалить первый столбец документа

    Лучше ли использовать карту или пакет mapreduce для создания задания Hadoop?

    Когда следует использовать Q_OBJECT?

    Подмножество данных содержит только столбцы, имена которых соответствуют условию

    Сократить визуальные избыточности в Outlook 2013?

    Слоты Dell Latitude E5550 M.2 – что я могу использовать?

    Давайте будем гением компьютера.