Почему Синглтон считается анти-паттерном?
Возможный дубликат:
Что такого плохого в синглетонах?
Недавно я слышал, что синглтон является анти-паттерном. Я знаю, что это связано с тем фактом, что создание синглтона класса похоже на превращение этого уникального экземпляра в глобальную переменную, но при этом он делает намного больше (ограничивает количество экземпляров этого объекта, управляет реализацией и т. Д.).
Почему именно Синглтон считается анти-паттерном? А какие есть альтернативы?
4 ответа
Чтобы помочь с ответом, вот больше о комментарии против шаблона:
он чрезмерно используется, вводит ненужные ограничения в ситуациях, когда единственный экземпляр класса фактически не требуется, и вводит глобальное состояние в приложение
От: http://en.wikipedia.org/wiki/Singleton_pattern
Подробнее об этом вы можете узнать по адресу: https://www.michaelsafyan.com/tech/design/patterns/singleton
Вот отличное окончание блога выше:
Короче говоря, одноэлементный шаблон делает код более сложным, менее полезным и реальным испытанием для повторного использования или тестирования. Ликвидация синглетонов может быть сложной задачей, но это стоит усилий.
Итак, причина того, что это анти-шаблон, хорошо описана в этом параграфе, и, как выражается автор, он тесно связывает ваш код с одноэлементным.
Если вы обнаружите, что хотите использовать синглтон, возможно, вы захотите рассмотреть свой дизайн, но бывают моменты, когда он полезен.
Например, однажды мне пришлось написать приложение, которое могло бы иметь самое большее одно соединение с базой данных, чтобы обрабатывать тысячи запросов. Итак, синглтон имеет смысл, поскольку я ограничен в ресурсах наличием только одного экземпляра.
Но, как правило, это используется для упрощения кода, не думая о трудностях, которые будут введены.
Например, и это также относится к статическим классам, если вы выполняете модульный тест или имеете параллелизм, то состояние одного запроса изменит состояние, и это может вызвать проблемы, поскольку класс, вызывающий экземпляр, может предполагать, что состояние таково, как оно ожидается.
Я думаю, что лучший способ оспорить использование - подумать о том, как справиться с ним, если ваша программа многопоточная, и простой способ сделать это - выполнить его модульное тестирование, если у вас есть несколько тестов, которые выполняются одновременно.
Если вы обнаружите, что он вам все еще нужен, используйте его, но осознайте проблемы, с которыми вы столкнетесь позже.
Я бы точно не считал синглтон анти-паттерном.
Однако синглтон - это в основном способ использования глобальных переменных. А глобальные переменные плохи, потому что любой код в любой точке системы может изменить свои значения. Поэтому при отладке может быть трудно определить, какой путь к коду ведет к текущему состоянию синглтона.
Синглтоны часто плохо реализованы. Смотрите двойную проверку блокировки.
В каком объеме экземпляр Singleton должен быть уникальным. Как многопоточные среды, кластеризация и т. Д.
Синглтоны могут быть сложными для тестирования.
Память, выделенная для Singleton, не может быть освобождена.
С избыточным использованием синглетонов вы переходите от неориентированного программирования к процедурному программированию.
Я думаю, что это считается анти-паттерном, потому что класс Singleton не может быть создан обычным способом другим объектом (кроме как путем вызова такого метода, обычно называемого "getInstance"). Таким образом, это будет выглядеть так, как будто класс используется напрямую, не создавая его экземпляров для создания объекта, пригодного для использования первым.
Я согласен с вами, что Синглтон может служить глобальным уникальным примером. Я узнал от некоторых людей, что в качестве альтернативы для Singleton мы можем использовать статические и / или конечные переменные, а также можем использовать перечисление (чтобы мы могли сгруппировать несколько переменных под одним именем группы, что мы обычно делаем, когда работаем с использованием нормальный класс / объект).
Однако эти альтернативы могут соответствовать только возможностям класса Singleton в хранении состояний / значений. Если нам нужны уникальные функции для работы, эти статические / конечные переменные и перечисления не могут помочь. На мой взгляд, это тот случай, когда нам нужно использовать класс Singleton (когда нам нужны уникальные функции для работы со статическими / конечными состояниями / значениями).
Ура...:))