Цель синглтонов в программировании - программирование
Подтвердить что ты не робот

Цель синглтонов в программировании

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

Это очень похоже на статический класс для меня. Основное различие заключается в том, что со статическим классом вы не можете/не можете его использовать, вы просто используете его, например, Math.pi(). С классом singleton вам все равно нужно сделать что-то вроде

singleton mySingleton = new singleton();
mysingleton.set_name("foo");
singleton otherSingleton = new singleton();
// correct me if i am wrong, but mysingleton == othersingleton right now, yes?
// this the following should happen?
otherSingleston.set_name("bar");
mysingleton.report_name(); // will output "bar" won't it?

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

4b9b3361

Ответ 1

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

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

Практический пример для хорошего использования singleton: у вас есть приложение, которое использует базу данных SQL, и вам нужен пул соединений. Целью такого пула является повторное использование соединения с БД, поэтому вы обязательно хотите, чтобы все клиенты использовали один и тот же пул. Таким образом, наличие в качестве одноэлементного кода является правильным дизайном. Но однажды вам понадобится приложение для подключения ко второму серверу БД и убедитесь, что вы не можете подключаться к разным серверам в одном пуле. Таким образом, ваш одноэлементный "один экземпляр" становится "одним экземпляром на сервере БД".

Ответ 2

почему вы не захотите

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

Основные причины:

  • Синглтоны в основном представляют глобальное состояние (это зло).
  • Правильная инъекция зависимостей становится невозможной.

Я предлагаю вам прочитать остальное (включая подробные объяснения) в этом блоге сотрудника Google:

Ответ 3

Синглтоны в основном полезны, когда вам нужен интерфейс для службы singleton, но вы не знаете до тех пор, пока не будет создан экземпляр конкретного класса.

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

Ответ 4

Как и другие говорили:

  • Синглтоны - это глобальные переменные с помощью другого имени.
  • Синглтоны - это, как правило, плохая идея.
  • Синглтоны могут быть заменены классами "monostate" - классами, которые имеют, по-видимому, обычную семантику построения/уничтожения, но все имеют одно и то же состояние.

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

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

Изменить: по запросу, почему большинство синглетонов являются глобальными переменными с помощью другого имени.

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

Ответ 5

Немного знаний - опасная вещь, а синглтоны - опасные существа. В дополнение к написанным выше, я могу подчеркнуть, что управление жизненным циклом объектов Singleton также важно. В среде ACE он успешно обрабатывается. Вы можете найти статью здесь: http://www.cs.wustl.edu/~schmidt/PDF/ObjMan.pdf

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

Ответ 6

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

Ответ 7

Существует два способа использования синглетонов.

  • Как они должны использоваться. Обычно с неизменяемыми переменными (С# String.Empty, классы в Smalltalk и т.д.). Это примерно 1% от использования синглтона.
  • В качестве замены глобальных переменных. Это плохо. Основная причина этого - люди, которые хотят обмениваться общими объектами, не понимая, как правильно использовать Builder. Использование синглтонов таким образом обычно является признаком отсутствия глубокого понимания объектно-ориентированного дизайна.

Ответ 8

Не все языки имеют "статические классы" (например, у С++ их нет).

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

Каждый язык отличается. Я думаю, в С# они не очень полезны (и на самом деле, из того, что я знаю, они не используются очень часто)

Ответ 9

  • Singleton - очень полезная замена глобальных переменных, используемых во всем коде.
  • Синглтоны обычно не являются "новыми" ed или "delete" d, они, как правило, инициализируются при первом использовании и удаляются вместе с областью программ
  • Синглтоны идеально подходят для обработки журналов, конфигураций и других аппаратно-интерфейсных классов.