Пример шаблона Singleton

Может ли кто-нибудь сказать мне хороший пример шаблона Singleton? Также у меня есть одно сомнение в том, чтобы спросить: имеет ли следующий сценарий одноэлементный шаблон:

Когда у нас много принтеров, подключенных в локальной сети, но только одна очередь принтера?

Ответы

Ответ 1

Singleton - это программный паттерн.

Здесь - пример в С#.

Наличие одной очереди в локальной сети скорее связано с проблемой аппаратного/сетевого дизайна, а не с концепцией программного обеспечения, поэтому это не применимо. Если вы моделировали такую ​​вещь в программном обеспечении и должны были быть уверены, что есть только одна очередь, тогда она будет применима.

Ответ 2

Мое личное правило для использования синглтонов заключается в том, что они будут использоваться только тогда, когда ошибка будет иметь более одного экземпляра, и требуется глобальный доступ. Я бы сказал, что очередь печати, следовательно, не является хорошим кандидатом для синглтона: потому что вам не нужен глобальный доступ, и также можно утверждать, что ошибка имеет более одного. Фактически, хотя может быть одна "физическая" очередь печати (например, на сервере печати где-то), что не то, что касается приложения, просто нужно отправить "задания":

PrintJobScheduler pjs;
pjs.SubmitPrintJob(myPrintJob);

Вам не нужно, чтобы мой воображаемый PrintJobScheduler был синглом, хотя он может разговаривать с сервисом "singleton" где-то в сети.

Ответ 3

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

В конечном итоге я все время использую конфигурацию .

Типичный один из моих конфигурационных синглетов будет содержать такие вещи, как IP-адреса, имена устройств и системные ограничения. При первом вызове он будет обычно считывать файл конфигурации (иногда и/или системный реестр в Windows) и загружать значения по умолчанию для элементов, которые там не найдены. На самом деле нет смысла, чтобы программа имела несколько конфигураций, поэтому весь этот материал должен быть просто прочитан один раз для всей программы. Кроме того, к элементам конфигурации могут потребоваться доступ к различным типам несвязанных друг другу классов в системе.

Ответ 4

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

Как минимум что мне сказали.

Ответ 5

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

Ответ 6

class Singleton
{
    #region Subj Implementation

    private Singleton() { }
    private static readonly Lazy<Singleton> _lazyInit = new Lazy<Singleton>
        (() => new Singleton());
    public static Singleton Instance { get { return _lazyInit.Value; } }

    #endregion
}

Ответ 7

если у меня есть много фильмов в одной папке, я выбираю все и нажимаю кнопку ввода, тогда создается более одного экземпляра проигрывателя (который вы используете, например, медиаплеер), что приводит к использованию ресурсов, поэтому theresould be singelton design pattern для создания только один экземпляр.

Ответ 8

Некоторые примеры, приведенные в этой статье об одноэлементном шаблоне.

Ответ 9

Шаблон Singleton управляет созданием объекта. Это гарантирует, что в любой данный момент времени присутствует только 1 объект. Это проще реализовать, но может быть опасным.

  • GC таких объектов сложно.
  • Трудно проверить

Я не думаю, что очередь принтеров - это одноэлементный шаблон.

Ответ 10

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

Если вы хотите увидеть код, вам придется всплывать Reflector... но Singleton отслеживает все доступные подключения и раздаёт их, когда они доступны.

Что касается вашего примера, это немного расплывчато. Лучшим примером может быть очередь документов на каждом отдельном принтере. Когда документы поступают на принтер, они помещаются в очередь. Каждый процесс, запущенный на принтере, захватывает документ из очереди Singleton (вместо создания собственной очереди для потока).

Ответ 11

class singleton{

    public static singleton obj = null;     
    protected singleton(){  }

    public static singleton getObj(){           
        if(obj == null){                
                obj =  new singleton();             
            }           
        return obj;     
    }       
}

public class First {
  public static void main(String[] args) {      
        singleton ss = singleton.getObj();      
    }
}