Зачем использовать синглтон вместо статических методов?

Я не нашел хороших ответов на эти простые вопросы об classах помощника / полезности:

Почему я должен создать singleton (stateless) вместо использования статических методов?

Зачем нужен экземпляр объекта, если объект не имеет состояния?

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

  • вы ожидаете продлить его состояние в обозримом будущем или
  • вам нужен экземпляр объекта по какой-то определенной технической причине (например, для оператора lock C #, хотя это уже довольно надуманно) или
  • вам нужно наследование, т. е. вы хотите легко заменить свой синглтон другим, используя тот же интерфейс, но с другой реализацией. Например, метод Toolkit.getDefaultToolkit() в Java вернет singleton, чей точный тип зависит от системы.

Я мог видеть случай использования одиночного одиночного синтаксиса вместо classа статических методов, а именно для Injection Dependency .

Если у вас есть вспомогательный class функций утилиты, который вы используете напрямую, он создает скрытую зависимость; вы не можете контролировать, кто может его использовать, или где. Внедрение этого же classа-помощника через экземпляр singleeless SingleStan позволяет контролировать, где и как он используется, и заменять его / mock / etc, когда вам нужно.

Создание экземпляра singleton просто гарантирует, что вы не выделяете больше объектов типа, чем необходимо (поскольку вам нужен только один).

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

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

В большинстве языков программирования classы ускользают от системы типов. Хотя class с его статическими методами и переменными является объектом, он очень часто не может реализовать интерфейс или расширять другие classы. По этой причине он не может использоваться полиморфным образом, поскольку он не может быть подтипом другого типа. Например, если у вас есть интерфейс IFooable , который требуется несколькими сигнатурами методов других classов, объект classа StaticFoo нельзя использовать вместо IFooable , тогда как FooSingleton.getInstance() может (предполагая, что FooSingleton реализует IFooable ).

Обратите внимание, что, поскольку я прокомментировал ответ Хайнци, синглтон является шаблоном для контроля над экземпляром. Он заменяет new Class() Class.getInstance() , который дает автору Class больше контроля над экземплярами, которые он может использовать для предотвращения создания ненужных экземпляров. Синглтон – это всего лишь особый случай фабричной модели и должен рассматриваться как таковой. Общее использование делает его скорее особым случаем глобальных реестров, что часто заканчивается плохо, потому что глобальные реестры не должны использоваться только волей-неволей.

Если вы планируете предоставлять глобальные вспомогательные функции, то статические методы будут работать нормально. Класс не будет действовать как class, а скорее как пространство имен. Я предлагаю, вы сохраняете высокую сплоченность, или вы можете столкнуться с самыми странными проблемами связи.

Greetz
back2dos

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

Рассмотрим пример: java.lang.Runtime – это одноэлементный class в java. Этот class допускает различные реализации для каждой JVM. Реализация является единой для JVM. Если бы этот class был статичным, мы не сможем передавать разные реализации на основе JVM.

Я нашел эту ссылку действительно полезной: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?

Надеюсь, поможет!!

Для меня «Хочу использовать объект State Singleton, Want Function использовать статический метод»

Это зависит от того, что вы хотите. Всякий раз, когда вы хотите, чтобы состояние объекта (например, polymorphism, как Null, вместо null или состояние по умолчанию), singleton является подходящим выбором для вас, тогда как статический метод используется, когда вам нужна функция (Receive input then return output).

Я рекомендую для случая singleton, он должен быть всегда одним и тем же состоянием после его создания. Он не должен быть клонимым и не принимать значения для включения (кроме статической конфигурации из файла, например файла свойств в java).

PS Производительность между этими 2 разными в миллисекундах, поэтому сначала сосредоточьтесь на архитектуре .

Синглтон не является апатридом, он держит глобальное состояние.

Некоторые причины, по которым я могу думать об использовании Singleton:

  • Чтобы избежать утечек памяти
  • Чтобы обеспечить одинаковое состояние для всех модhive в приложении, например, подключение к базе данных
  • Есть простой, элегантный способ определения одиночных чисел?
  • Когда должен быть создан / открыт экземпляр EntityManagerFactory?
  • Контекст Singleton Per Call (веб-запрос) в Unity
  • Java Singleton и синхронизация
  • Как создать одноэлементный class в объекте C
  • Явная блокировка Java
  • Singleton со свойствами в Swift 3
  • Синглтоны действительно так плохо?
  • Экземпляр Singleton, объявленный как статическая переменная метода GetInstance, является поточно-безопасным?
  • Синглтоны: хороший дизайн или костыль?
  • Безопасность streamов в Синглтоне
  • Давайте будем гением компьютера.