Кто-либо может сказать мне хороший пример Шаблона "одиночка"? Также у меня есть одно сомнение для выяснения, следующий сценарий, тот из шаблона "одиночка":
Когда у нас есть много принтеров, подключенных в LAN, но только одна очередь печати?
Синглтон - это программный шаблон.
Здесь - пример на C #.
Наличие единой очереди в локальной сети - это скорее проблема проектирования оборудования / сети, чем концепция программного обеспечения, поэтому на самом деле не применима. Если бы вы моделировали такую вещь в программном обеспечении и имели бы , чтобы быть уверенным, что есть только одна очередь, тогда это было бы применимо.
Ответ HTTP может быть хорошим примером. Вы не хотите, чтобы два или более экземпляра отправляли противоречащие заголовки.
Шаблон Singleton управляет созданием объекта. Это гарантирует, что в любой момент времени присутствует только 1 объект. Это проще реализовать, но это может быть опасно.
Я не думаю, что очередь печати - это одноэлементный шаблон.
В игровом дизайне, если у вас есть дескриптор графического устройства или аналогичная аппаратная абстракция, отвечающая за один ресурс, такой как рендеринг или звук, тогда это должен быть синглтон. .
По крайней мере, мне так сказали.
Один из лучших примеров (в реальной жизни) шаблона Singleton, который я видел, - это пул соединений SQL в .NET.
Если вы хотите увидеть код, вам придется открыть Reflector ... но Singleton отслеживает все доступные соединения и выдает их по мере их доступности.
Что касается вашего примера, он немного расплывчатый. Очередь документов на каждом отдельном принтере может быть лучшим примером. По мере поступления документов на принтер они ставятся в очередь. Затем каждый процесс, запущенный на принтере, берет документ из очереди Singleton (вместо того, чтобы создавать свою собственную очередь для своего потока).
Общая идея синглтона заключается в том, что это объект, для которого нет смысла иметь более одного, и к которому может потребоваться доступ ко всем над вашей программой.
Я все время использую конфигурацию программы .
Типичный один из моих синглтонов конфигурации будет содержать такие вещи, как IP-адреса, имена устройств и системные ограничения. При первом вызове он обычно читает файл конфигурации (иногда и / или системный реестр в Windows) и загружает значения по умолчанию для элементов, которых там нет. Для программы действительно нет смысла иметь несколько конфигураций, поэтому все это нужно просто прочитать один раз для всей программы. Кроме того, к элементам конфигурации может потребоваться доступ для всех видов различных классов системы, которые в противном случае не связаны друг с другом.
Мое личное правило использования синглтонов - использовать его только тогда, когда возникает ошибка , когда существует более одного экземпляра, и требуется глобальный доступ . Я бы сказал, что очередь печати поэтому не хороший кандидат для синглтона: потому что вам не нужен глобальный доступ, и также можно утверждать, что наличие более одного объекта является ошибкой. Фактически, хотя может существовать одна «физическая» очередь печати (например, где-то на сервере печати), это не то, о чем приложение заботится, ему просто нужно отправлять «задания»:
PrintJobScheduler pjs;
pjs.SubmitPrintJob(myPrintJob);
Вам не нужны мои воображаемые PrintJobScheduler
должен быть одноэлементным, даже если он может взаимодействовать с «одноэлементной» службой где-то в сети.