Пример синглтон-паттерна - PullRequest
14 голосов
/ 06 апреля 2010

Кто-нибудь может сказать мне хороший пример паттерна синглтона? Также у меня есть одно сомнение: следующий сценарий - это сценарий синглтона:

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

Ответы [ 12 ]

8 голосов
/ 06 апреля 2010

Singleton - это программный шаблон.

Здесь является примером на C #.

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

6 голосов
/ 06 апреля 2010

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

PrintJobScheduler pjs;
pjs.SubmitPrintJob(myPrintJob);

Вы не делаетеМне нужно, чтобы мой воображаемый PrintJobScheduler был одноэлементным, даже если он говорит с «одноэлементным» сервисом где-то в сети.

4 голосов
/ 06 апреля 2010

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

По крайней мере это то, что мне сказали.

4 голосов
/ 06 апреля 2010

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

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

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

2 голосов
/ 28 января 2013

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

2 голосов
/ 16 мая 2012
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
}
2 голосов
/ 06 апреля 2010

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

1 голос
/ 04 октября 2018

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

  • Это статично в природе
  • частный конструктор
  • закрытый статический экземпляр класса
  • метод публичного статического получения
  • нет параметров для конструктора

создать синглтон-класс

public class Singleton {

    private static Singleton object = null;

    private Singleton() {
    }
    public static Singleton getInstance() {
        if (object == null) {
            object = new Singleton();
        }
        return object;
    }
    public void showMessage() {
        System.out.println("Singleton Pattern");
    }
}

создать демонстрационный класс

public class Demo {
    public static void main(String[] args) {
        Singleton object = Singleton.getInstance();
        object.showMessage();
    }
}

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

Как это;

public class Singleton {

    private static Singleton object = null;

    private Singleton() {
    }
    public static synchronized Singleton getInstance() {
        if (object == null) {
            object = new Singleton();
        }
        return object;
    }

}
1 голос
/ 20 июля 2013

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

1 голос
/ 06 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...