Я никогда не находил хороших ответов на эти простые вопросы о вспомогательных / служебных классах:
Зачем мне создавать синглтон (без сохранения состояния) вместо использования статических методов?
Зачем нужен экземпляр объекта, если у объекта нет состояния?
java
design-patterns
singleton
Себастьян Лорбер
источник
источник
Ответы:
Часто синглтоны используются, чтобы ввести какое-то глобальное состояние в приложение. (Честно говоря, чаще, чем действительно необходимо, но это тема для другого раза.)
Однако есть несколько угловых случаев, когда может быть полезен даже синглтон без сохранения состояния:
Пример: объекты синхронизации для оператора C #
lock
или Javasynchronized
.Пример:
Toolkit.getDefaultToolkit()
метод в Java вернет одноэлемент, точный тип которого зависит от системы.Пример:
DBNull.Value
в C #.источник
Я мог видеть случай использования синглтона без сохранения состояния вместо класса статических методов, а именно для внедрения зависимостей .
Если у вас есть вспомогательный класс служебных функций, который вы используете напрямую, он создает скрытую зависимость; у вас нет контроля над тем, кто может его использовать и где. Внедрение того же вспомогательного класса через экземпляр синглтона без сохранения состояния позволяет вам контролировать, где и как он используется, и заменять его / издеваться над ним / и т. Д., Когда вам нужно.
Создание одноэлементного экземпляра просто гарантирует, что вы не выделяете больше объектов этого типа, чем необходимо (поскольку вам всегда нужен только один).
источник
На самом деле я нашел еще один ответ, не упомянутый здесь: статические методы труднее тестировать.
Кажется, что большинство тестовых фреймворков отлично подходят для имитации методов экземпляра, но многие из них не справляются должным образом с имитацией статических методов.
источник
В большинстве языков программирования классы во многом ускользают от системы типов. Хотя класс со своими статическими методами и переменными является объектом, он очень часто не может реализовать интерфейс или расширить другие классы. По этой причине его нельзя использовать полиморфным образом, поскольку он не может быть подтипом другого типа. Например, если у вас есть интерфейс
IFooable
, который требуется для нескольких сигнатур методов других классов, объект классаStaticFoo
не может использоваться вместоIFooable
, тогда какFooSingleton.getInstance()
может (при условии,FooSingleton
реализуетIFooable
).Обратите внимание, что, как я прокомментировал ответ Хайнци, синглтон - это шаблон для управления созданием экземпляра. Он заменяется
new Class()
наClass.getInstance()
, что дает авторуClass
больше контроля над экземплярами, которые он может использовать для предотвращения создания ненужных экземпляров. Синглтон - это просто особый случай фабричного шаблона, и его следует рассматривать как таковой. Обычное использование делает его скорее особым случаем глобальных реестров, что часто заканчивается неудачей, потому что глобальные реестры не должны использоваться просто так.Если вы планируете предоставлять глобальные вспомогательные функции, то статические методы будут работать нормально. Класс будет действовать не как класс, а как пространство имен. Я предлагаю вам сохранить высокую сплоченность, иначе у вас могут возникнуть самые странные проблемы со связью.
greetz
back2dos
источник
Существует компромисс между тем, какой именно. Синглтоны могут иметь состояние, а могут и не иметь, и они относятся к объектам. Если они не сохраняют состояние и используются только для глобального доступа, то лучше использовать static, поскольку эти методы будут быстрее. Но если вы хотите использовать объекты и концепции ООП (полиморфизм наследования), то синглтон лучше.
Рассмотрим пример: java.lang.Runtime - это одноэлементный класс в java. Этот класс допускает разные реализации для каждой JVM. Реализация одна для каждой JVM. Если бы этот класс был статическим, мы не могли бы передавать различные реализации на основе JVM.
Я нашел эту ссылку действительно полезной: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
Надеюсь, это поможет!!
источник
Для меня «Состояние объекта хочу использовать синглтон, функция хочу использовать статический метод»
Все зависит от того, чего вы хотите. Всякий раз, когда вам нужно состояние объекта (например, полиморфизм, такой как состояние Null вместо состояния по
null
умолчанию), singleton является подходящим выбором для вас, тогда как статический метод используется, когда вам нужна функция (получение входных данных, а затем возврат вывода).Я рекомендую для случая синглтона, он всегда должен быть в том же состоянии после его создания. Он не должен быть ни клонируемым, ни получать какое-либо значение для установки (кроме статической конфигурации из файла, например, файла свойств в java).
PS Производительность между этими двумя различается в миллисекундах, поэтому сначала сосредоточьтесь на архитектуре .
источник
Синглтон не является апатридом, он хранит глобальное состояние.
Вот некоторые причины, по которым я могу использовать Singleton:
источник