2010-04-06 13 views
14

Kann mir jemand ein gutes Beispiel für Singleton-Muster sagen? Auch ich habe einen Zweifel zu fragen, ist das folgende Szenario das von Singleton-Muster:Beispiel für Singleton-Muster

Wenn wir viele Drucker im LAN verbunden haben, aber nur eine Druckerwarteschlange?

+4

versuchen, mehrere Fenster von 'Windows Media Player' zu öffnen, ich denke, Sie können nur eins nach dem anderen öffnen, es ist ein Singleton. – Rajat

+0

@all: Es hat mir sehr geholfen. Danke vielmals. :) – Supereme

Antwort

7

Singleton ist ein Softwaremuster.

Here ist ein Beispiel in C#.

Eine einzige Warteschlange in einem LAN ist eher ein Hardware/Netzwerk-Design-Problem als ein Softwarekonzept, also nicht wirklich anwendbar. Wenn Sie Modellierung so eine Sache in Software und hatten, um sicher zu sein, es gibt nur eine Warteschlange, dann wäre es anwendbar.

6

Meine persönliche Regel Singletons für die Nutzung ist, dass nur verwendet werden, wenn es ein Fehler für mehr als eine Instanz zu sein, und die globale Zugriff ist erforderlich. Ich würde sagen, dass eine Druckwarteschlange daher nicht ein guter Kandidat für Singleton ist: weil Sie keinen globalen Zugriff benötigen, und es ist auch vertretbar, dass es ein Fehler ist, mehr als einen zu haben. In der Tat, während es eine „physische“ kann die Druckwarteschlange (zB auf einen Druckserver irgendwo), das ist nicht das, was die Anwendung kümmert sich um, es muss nur einreichen „Jobs“:

PrintJobScheduler pjs; 
pjs.SubmitPrintJob(myPrintJob); 

Sie brauchen nicht mein imaginäres PrintJobScheduler, um ein Singleton zu sein, obwohl es mit einem "Singleton" -Service irgendwo im Netzwerk sprechen kann.

1

Singleton-Muster steuert die Objekterstellung. Es garantiert, dass zu jedem Zeitpunkt nur 1 Objekt vorhanden ist. Es ist einfacher zu implementieren, kann aber gefährlich sein.

  1. GC von solchen Objekten ist schwierig.
  2. Schwierige

Ich glaube nicht, Druckerwarteschlange ein Singletonmuster zu testen ist.

1

Eines der besten Beispiele (im wirklichen Leben) des Singleton-Musters, das ich gesehen habe, ist SQL Connection Pooling in .NET.

Wenn Sie den Code sehen möchten, müssen Sie Reflektor öffnen ... aber der Singleton verfolgt alle verfügbaren Verbindungen und verteilt sie, wie sie verfügbar sind.

Für Ihr Beispiel ist es ein wenig vage. Die Dokumentenwarteschlange auf jedem einzelnen Drucker könnte ein besseres Beispiel sein. Wenn Dokumente zum Drucker kommen, werden sie in die Warteschlange gestellt. Jeder Prozess, der auf dem Drucker ausgeführt wird, greift dann ein Dokument aus der Singleton-Warteschlange (anstatt eine eigene Warteschlange für seinen Thread zu erstellen).

+0

persönlich und ohne tatsächlich die Pooling .NET SQL-Verbindung gesehen zu haben, bevorzugen I'ld für verschiedene Datenbanken verschiedenen Pools zu haben, unterschiedliche Zugriffsarten (nur lesen, lesen/schreiben) und Benutzer, und auch für unterschiedliche Prioritäten. Also: eine Menge von Pools, d. H. Kein Singleton. – digitalarbeiter

4

Die allgemeine Idee hinter einem Singleton ist, dass es ein Objekt ist, für das es keinen Sinn macht, mehr als eins zu haben, und auf das möglicherweise überall in Ihrem Programm zugegriffen werden muss.

Die eine, die ich am Ende benutze die ganze Zeit ist ein Programm Konfiguration.

Ein typischer einer meiner Konfiguration Singletons werden Dinge wie IP-Adressen, Gerätenamen und Systemgrenzen enthalten. Beim ersten Aufruf liest es typischerweise eine Konfigurationsdatei (manchmal und/oder die Systemregistrierung unter Windows) und lädt Standardwerte für Elemente, die dort nicht gefunden werden. Es macht wirklich keinen Sinn, wenn ein Programm mehrere Konfigurationen hat, also sollten all diese Dinge nur einmal für das gesamte Programm eingelesen werden. Darüber hinaus müssen möglicherweise Konfigurationselemente von allen Arten von verschiedenen anderen Klassen im System zugegriffen werden.

+0

Ich denke, statische Schlüsselwort ist in dieser Art von Szenario hilfreicher. Was du sagst? –

+0

@NIVESHSENGAR - Ehrlich gesagt, bin ich auf der Seite derer, die glauben, Singleton sei ein Anti-Pattern. (http://caines.ca/blog/programming/singletons-anti-pattern-or-worst-anti-pattern-ever/) Ich mache jetzt gerne Konfigurationsobjekte, die dem Hauptprogramm gehören und in Objekten aufgebaut sind, die sie benötigen . –

2

Ein HTTP-Antwort könnte ein gutes Beispiel sein. Sie möchten nicht, dass zwei oder mehr Instanzen widersprüchliche Header senden.

4

In Game Design, wenn Sie eine Grafikgerätegriff oder ähnliche Hardware Abstraction haben, die für eine einzelne Ressource wie Rendering oder Audio verantwortlich ist, dann sollte es ein Singleton sein.

Mindestens that's what I was told.

2
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

wenn ich habe viele Filme in einem Ordner i alle wählen und ENTER drücken dann mehr Instanzen von Spielern (die man zB Media-Player verwenden) geschaffen werden, die dazu führt, Verwendung von Ressourcen, so dass ein Singleton-Entwurfsmuster erstellt werden sollte, um nur eine Instanz zu erzeugen.

2

Einige der in this Artikel über Singletonmuster angegebenen Beispiele.

+2

Beachten Sie, dass Link-Only-Antworten nicht empfohlen werden. SO-Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (im Gegensatz zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit abgestanden werden). Bitte beachten Sie, dass Sie hier eine eigenständige Zusammenfassung hinzufügen und den Link als Referenz beibehalten. – kleopatra

+1

Die angegebene URL funktioniert nicht. Ich empfehle dringend, nicht darauf zu klicken. – arsho

-1
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();  
    } 
}