При каких обстоятельствах я должен использовать Singleton-класс?

Чтобы проверить, существует ли ваш файл conf, вы можете использовать stat ( https://docs.ansible.com/ansible/latest/modules/stat_module.html )

- stat:
path: "/path/to/conf/file"
register: conf_file

- name: DO it if conf file exists
  action: {...}
  when: "conf_file.stat.exists == True"

5
задан Community 23 May 2017 в 12:18
поделиться

11 ответов

Я нашел, что шаблон "одиночка" подходит для класса что:

  • Не имеет никакого состояния
  • Полно основных "Военнослужащих"
  • Должен строго контролировать его ресурсы.

Примером этого был бы класс доступа к данным.

У Вас были бы методы, которые берут в параметрах, и возврат говорит, DataReader, но Вы не управляете состоянием читателя в одиночном элементе, Вы просто получаете его и возвращаете его.

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

Однако Singleton была изобретена до понятия.NET полностью статических классов, таким образом, я нахожусь на заборе на том, если необходимо пойти одним путем или или другой. На самом деле это - превосходный вопрос спросить.

3
ответ дан 18 December 2019 в 08:32
поделиться

Этот вопрос задали, прежде чем я буду думать. Взгляните здесь

Посмотрите этот вопрос:
На Шаблонах разработки: Когда использовать Singleton?

3
ответ дан 18 December 2019 в 08:32
поделиться

Вы, вероятно, не хотели бы использовать Singleton для обстоятельств, которые Вы описываете. Наличие всех соединений с DB идет через единственный экземпляр класса типа DBD/DBI, серьезно отрегулировал бы Вашу пропускную способность запроса.

HTH

удачи,

Ограбить

4
ответ дан 18 December 2019 в 08:32
поделиться

Singleton является полезный Шаблон разработки для разрешения только одного экземпляра Вашего класса. Цель Singleton к созданию объекта управления, ограничивая число одним, но позволяя гибкости создать больше объектов, если ситуация изменяется. С тех пор существует только один экземпляр Singleton, любые поля экземпляра Singleton произойдут только однажды в классе, точно так же, как статические поля.

Источник: java.sun.com

1
ответ дан 18 December 2019 в 08:32
поделиться

Из "шаблонов разработки: элементы допускающего повторное использование объектно-ориентированного программного обеспечения":

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

Используйте Шаблон "одиночка" когда:

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

Вообще говоря, в веб-разработке, единственные вещи, которые должны на самом деле реализовать Шаблон "одиночка", находятся в самой веб-платформе; весь код, который Вы пишете в своем приложении (вообще говоря), должен принять параллелизм и полагаться на что-то как база данных или состояние сеанса для реализации глобальный (перекрестный пользователь) поведения.

3
ответ дан 18 December 2019 в 08:32
поделиться

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

1
ответ дан 18 December 2019 в 08:32
поделиться
  1. использование одиночного элемента здесь ничего действительно не дает Вам, но ограничивает гибкость
  2. Вы ХОТИТЕ параллелизм, или Вы не масштабируетесь
  3. волнение по поводу соединений и памяти здесь является преждевременной оптимизацией
1
ответ дан 18 December 2019 в 08:32
поделиться

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

Если будет состояние экземпляра, которое может варьироваться среди экземпляров класса, то шаблон "одиночка" не будет работать; Вам нужен больше чем один экземпляр.

Это следует, затем, исчерпанием, что единственные случаи, в которых должна использоваться Singleton, - когда существует состояние, которое должно быть общим для все средства доступа и только указать, что это должно быть общим для все средства доступа.

Существует несколько вещей, которые могут привести к чему-то как одиночный элемент:

  • Шаблон "фабрика": Вы создаете и возвращаете объект, с помощью некоторого общего состояния.
  • Пулы ресурсов: у Вас есть общая таблица некоторых ограниченных ресурсов, как соединения с базой данных, которыми необходимо справиться среди большой группы пользователей. (bumpo версия - то, где существует одно соединение с БД, сохраненное одиночным элементом.)
  • Управление совместным выполнением внешнего ресурса; семафор обычно будет вариантом одиночного элемента, потому что операции P/V должны атомарно изменить общий счетчик.
1
ответ дан 18 December 2019 в 08:32
поделиться

Шаблон "одиночка" потерял много своего сияния в последние годы, главным образом из-за повышения поблочного тестирования.

Одиночные элементы могут сделать поблочное тестирование очень трудным - если можно только когда-либо создавать один экземпляр, как может Вы тесты записи, которые требуют "новых" экземпляров объекта под тестом? Если один тест изменяет тот одиночный элемент в некотором роде, дальнейшие тесты против того же самого объекта действительно не запускаются с чистого листа.

Одиночные элементы также проблематичны, потому что они - эффективно глобальные переменные. У нас была проблема поточной обработки несколько недель назад в моем офисе из-за Singleton, глобальной, который изменялся от различных потоков; разработчик был ослеплен при помощи санкционированного "Шаблона", не поняв, что то, что он действительно создавал, было глобальной переменной.

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

Вместо того, чтобы создавать Singleton, рассмотрите обеспечение статического метода фабрики, который возвращает экземпляр; это, по крайней мере, дает Вам способность передумать в будущем, не повреждая Ваш API.

У Josh Bloch есть хорошее обсуждение этого в Эффективном Java.

1
ответ дан 18 December 2019 в 08:32
поделиться

с c# я сказал бы, что одиночный элемент является редко соответствующим. Большая часть использования для одиночного элемента лучше разрешена со статическим классом. Быть помнящим потокобезопасность чрезвычайно важно хотя с чем-либо статическим. Для доступа к базе данных Вы, вероятно, не хотите единственное соединение, как упомянуто выше. Ваш лучший выбор состоит в том, чтобы создать соединение и использовать созданный в объединении. Можно создать статический метод, который возвращает новое соединение для сокращения кода, если Вам нравится. Однако шаблон/платформа ORM может быть лучше все еще.

В c# 3.5 методы расширения могут быть более соответствующими, чем статический класс.

0
ответ дан 18 December 2019 в 08:32
поделиться

У Вас есть слой репозитория, который Вы хотите созданный однажды, и что ссылка еще использовала везде.

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

Мой совет:

  1. Найдите МОК, что Вы любите и интегрируете его в свое приложение (StructureMap, Единица, Spring. Сеть, замок Windsor, Autofac, Ninject... выбирают один).
  2. Реализуйте интерфейс для Вас репозиторий.
  3. Скажите МОК рассматривать репозиторий как одиночный элемент и возвращать его, когда код попросит репозиторий интерфейсом.
  4. Узнайте о внедрении зависимости.

Это - большая работа для простого вопроса. Но Вы будете более обеспечены.

1
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: