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



Я никогда не находил хороших ответов на эти простые вопросы о классах helper / utility:



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



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

823   7  

7 ответов:

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

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

Я мог видеть случай, когда синглтон без состояния используется вместо класса статических методов, а именно для Инъекции Зависимостей.

Если у вас есть вспомогательный класс служебных функций, которые вы используете напрямую, он создает скрытую зависимость; у вас нет контроля над тем, кто может его использовать или где. Инъекция того же вспомогательного класса через одноэлементный экземпляр без состояния позволяет вам контролировать, где и как он используется, и заменять его / mock it / etc. когда тебе это нужно.

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

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

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

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

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

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

greetz
back2dos

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

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

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

надеюсь, что это помогает!!

для меня "хотите состояние объекта использовать Синглтон, хотите функцию использовать статический метод"

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

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

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

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

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

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

Comments

    Ничего не найдено.