Gibt es praktikable Alternativen zum GOF Singleton Pattern?

91

Seien wir ehrlich. Das Singleton-Muster ist ein sehr kontroverses Thema mit Hordenprogrammierern auf beiden Seiten des Zauns. Es gibt Menschen, die das Gefühl haben, der Singleton sei nichts anderes als eine verherrlichte globale Variable, und andere, die auf Muster schwören und es ununterbrochen verwenden. Ich möchte jedoch nicht, dass die Singleton-Kontroverse im Mittelpunkt meiner Frage steht. Jeder kann ein Tauziehen haben und es bekämpfen und sehen, wer für alles gewinnt, was mir wichtig ist . Ich versuche zu sagen, ich glaube nicht, dass es eine einzige richtige Antwort gibt, und ich versuche nicht absichtlich, Partisanenstreitigkeiten zu entfachen. Ich interessiere mich einfach für Singleton-Alternativen, wenn ich die Frage stelle:

Gibt es spezielle Alternativen zum GOF Singleton Pattern?

Wenn ich beispielsweise in der Vergangenheit oft das Singleton-Muster verwendet habe, bin ich einfach daran interessiert, den Status / die Werte einer oder mehrerer Variablen beizubehalten. Der Zustand / die Werte von Variablen können jedoch zwischen jeder Instanziierung der Klasse unter Verwendung statischer Variablen anstelle des Singleton-Musters beibehalten werden .

Welche andere Idee hast du?

EDIT: Ich möchte nicht, dass dies ein weiterer Beitrag über "Wie man den Singleton richtig benutzt" ist. Wieder suche ich nach Möglichkeiten, dies zu vermeiden. Zum Spaß, ok? Ich schätze, ich stelle eine rein akademische Frage in Ihrer besten Filmtrailer-Stimme: "Was können wir in einem Paralleluniversum tun, in dem es keinen Singleton gibt?"

CodingWithoutComments
quelle
Was? Es ist weder gut noch schlecht, aber wie kann ich es ersetzen? Für alle Leute, die sagen, dass es gut ist - nehmen Sie nicht teil. Alle Leute, die sagen, dass es schlecht ist, beweisen es, indem sie mir zeigen, wie ich ohne es leben kann. Klingt für mich argumentativ.
S.Lott
@CodingWithoutComents: habe den ganzen Beitrag gelesen. So bekam ich das Gefühl "Antworte nicht, wenn dir Singletons in Ordnung sind".
S.Lott
2
Nun, wenn es so rüberkam, entschuldige ich mich. Ich dachte, ich hätte bedeutende Schritte unternommen, um eine Polarisierung zu vermeiden. Ich dachte, ich hätte die Frage so gestellt, dass sowohl Liebhaber als auch Hasser von Singletons davonkommen könnten, dass wir als Programmierer alle die Wahl haben - dass dies nie nur ein richtiger Weg ist
CodingWithoutComments
Wenn ich Singletons verwende, habe ich keinen möglichen Beitrag dazu, wie ich sie umgehen kann. Klingt für mich polarisierend.
S.Lott
9
Ich benutze jeden Tag Singletons, aber hindert mich das daran zu denken, dass es möglicherweise einen besseren Weg gibt, Dinge zu tun? Design Patterns gibt es erst seit 14 Jahren. Nehme ich sie als biblische Wahrheit? Hören wir auf, über den Tellerrand hinaus zu denken? Versuchen wir nicht, die Disziplin der CS voranzutreiben?
CodingWithoutComments

Antworten:

75

Alex Miller zitiert in " Patterns I Hate " Folgendes:

"Wenn ein Singleton die Antwort zu sein scheint, finde ich es oft klüger:

  1. Erstellen Sie eine Schnittstelle und eine Standardimplementierung Ihres Singletons
  2. Erstellen Sie eine einzelne Instanz Ihrer Standardimplementierung oben auf Ihrem System. Dies kann in einer Spring-Konfiguration oder im Code erfolgen oder je nach System auf verschiedene Arten definiert werden.
  3. Übergeben Sie die einzelne Instanz an jede Komponente, die sie benötigt (Abhängigkeitsinjektion).
Jacek Szymański
quelle
2
Ich weiß, dass dies fast 5 Jahre alt ist, aber könnten Sie das erweitern? Ich glaube, mir wurde beigebracht, dass der richtige Weg, einen Singleton zu erstellen, eine Schnittstelle war. Es würde mich interessieren, ob das, was ich tat, "OK" war und nicht so schrecklich, wie mir gesagt wurde.
Pureferret
97

Um zu verstehen, wie Singletons richtig umgangen werden können, müssen Sie verstehen, was mit Singletons (und dem globalen Status im Allgemeinen) nicht stimmt:

Singletons verbergen Abhängigkeiten.

Warum ist das wichtig?

Denn wenn Sie die Abhängigkeiten ausblenden, verlieren Sie häufig den Überblick über das Ausmaß der Kopplung.

Sie könnten das argumentieren

void purchaseLaptop(String creditCardNumber, int price){
  CreditCardProcessor.getInstance().debit(creditCardNumber, amount);
  Cart.getInstance().addLaptop();
}

ist einfacher als

void purchaseLaptop(CreditCardProcessor creditCardProcessor, Cart cart, 
                    String creditCardNumber, int price){
  creditCardProcessor.debit(creditCardNumber, amount);
  cart.addLaptop();
}

Aber zumindest die zweite API macht deutlich, was genau die Mitarbeiter der Methode sind.

Die Umgehung von Singletons besteht also nicht darin, statische Variablen oder Service-Locators zu verwenden, sondern die Singleton-Klassen in Instanzen zu ändern, die in dem Bereich instanziiert werden, in dem sie sinnvoll sind, und in die Komponenten und Methoden eingefügt werden, die sie benötigen. Sie können ein IoC-Framework verwenden, um dies zu handhaben, oder Sie können es manuell tun, aber das Wichtigste ist, Ihren globalen Status loszuwerden und die Abhängigkeiten und Kollaborationen explizit zu machen.

Rasmus Faber
quelle
+1 Um die Wurzel des Problems zu diskutieren, nicht nur, wie man es umgeht.
Phil
9
In einer vollwertigen mehrschichtigen Anwendung erzeugt die zweite Methode häufig eine große Menge an unnötigem Code. Indem wir den Code der mittleren Ebenen mit Logik verschmutzen, um sie auf die unteren Ebenen zu übertragen, Objekte, die auf dieser Ebene ansonsten nicht erforderlich sind, schaffen wir dann keine Abhängigkeiten, die es nicht sein müssen? Angenommen, Tier 4 in einem Navigationsstapel initiiert eine Hintergrundaktion wie einen Datei-Upload. Angenommen, Sie möchten den Benutzer benachrichtigen, wenn der Vorgang abgeschlossen ist. Bis dahin befindet sich der Benutzer möglicherweise in einem völlig anderen Teil der Anwendung, der nur Tier 1 gemeinsam mit der initiierenden Ansicht verwendet. Tonnenweise nicht benötigten Code ...
Hari Karam Singh
1
@RasmusFaber Ein Singleton-Muster verbirgt keine Abhängigkeiten. Ihre Beschwerde über das Ausblenden von Abhängigkeiten ist ein vom Muster getrenntes Problem. Es ist wahr, dass das Muster es leicht macht, diesen Fehler zu machen, aber es ist sehr gut möglich, IoC- und Singleton-Muster in Harmonie zusammen auszuführen. Zum Beispiel kann ich eine Drittanbieter-Bibliothek erstellen, die eine spezielle Lebenszyklusverwaltung ihrer Instanzen benötigt, und jeder, der meine Bibliothek verwendet, sollte dennoch eine Instanz meines Singletons mithilfe der klassischen Abhängigkeitsinjektion an seine Klassen "übergeben", anstatt meinen Singleton "Sky Hook" zu verwenden von jedem Punktschnitt.
Martin Bliss
@HariKaramSingh Sie können das Abonnement- / Veröffentlichungsmuster oder den systemweiten Ereignisbus (der von allen betroffenen Parteien gemeinsam genutzt werden muss, nicht von einem Singleton) verwenden, um dies zu umgehen.
Victor Sorokin
4
Auch Pub / Sub- oder Beobachtermuster können genauso schlecht sein, wenn sie "den Überblick über die Kopplung verlieren", wie es jeder bezeugen wird, der ein Debugging durch ein Framework durchführen musste, das sich stark auf sie stützt. Zumindest bei Singletons befindet sich der aufgerufene Methodenname an derselben Stelle wie der aufrufende Code :) Persönlich denke ich, dass all diese Strategien ihren Platz haben und keine blind implementiert werden kann. Schlampige Codierer machen aus jedem Muster Spaghetti, und verantwortungsbewusste Codierer müssen sich nicht übermäßig mit ideologischen Einschränkungen belasten, um eleganten Code zu erstellen.
Hari Karam Singh
14

Die beste Lösung, auf die ich gestoßen bin, ist die Verwendung des Factory-Musters, um Instanzen Ihrer Klassen zu erstellen. Mithilfe des Musters können Sie sicherstellen, dass nur eine Instanz einer Klasse von den Objekten gemeinsam genutzt wird, die sie verwenden.

Ich dachte, es wäre kompliziert zu verwalten, aber nach dem Lesen dieses Blog-Beitrags "Wo sind all die Singletons geblieben?" scheint es so natürlich. Abgesehen davon hilft es sehr bei der Isolierung Ihrer Unit-Tests.

Was müssen Sie zusammenfassend tun? Wenn ein Objekt von einem anderen abhängt, erhält es eine Instanz nur über seinen Konstruktor (kein neues Schlüsselwort in Ihrer Klasse).

class NeedyClass {

    private ExSingletonClass exSingleton;

    public NeedyClass(ExSingletonClass exSingleton){
        this.exSingleton = exSingleton;
    }

    // Here goes some code that uses the exSingleton object
}

Und dann die Fabrik.

class FactoryOfNeedy {

    private ExSingletonClass exSingleton;

    public FactoryOfNeedy() {
        this.exSingleton = new ExSingletonClass();
    }

    public NeedyClass buildNeedy() {
        return new NeedyClass(this.exSingleton);
    }
}

Da Sie Ihre Factory nur einmal instanziieren, wird exSingleton nur einmal instanziiert. Jedes Mal, wenn Sie buildNeedy aufrufen, wird die neue Instanz von NeedyClass mit exSingleton gebündelt.

Ich hoffe das hilft. Bitte weisen Sie auf Fehler hin.

Seuvitor
quelle
5
Um sicherzustellen, dass Ihre Factory nur instanziiert wird, wenn Sie einen privaten Construtor benötigen, definieren Sie die buildNeedy-Methode als statische Methode.
Julien Grenier
16
Julien hat recht, dieses Update hat einen grundlegenden Fehler, nämlich dass Sie implizit sagen, dass Sie nur eine Fabrik instanziieren können. Wenn Sie die notwendigen Vorkehrungen treffen, um sicherzustellen, dass nur eine Fabrik instanziiert wird (wie Julien sagte), erhalten Sie ... einen Singleton! In Wirklichkeit fügt dieser Ansatz nur eine unnötige Abstraktionsebene über dem Singleton hinzu.
Bob Somers
Es gibt eine andere Möglichkeit, nur eine Instanz zu haben. Sie können Ihre Fabrik nur einmal instanziieren. Dies muss vom Compiler nicht erzwungen werden. Dies hilft auch bei Unittests, bei denen Sie eine andere Instanz wünschen .
Braten
Dies ist die beste Lösung, die ich je für das Problem gesehen habe, das mit Singletons falsch gelöst wurde - Hinzufügen von Abhängigkeiten, ohne jeden Methodenaufruf zu überladen (und daher die Schnittstelle neu zu gestalten und ihre Abhängigkeiten neu zu gestalten). Eine geringfügige Änderung ist perfekt für meine Situation, in der es nicht wichtig ist, dass es nur eine Instanz des "Singleton" gibt, aber es ist wichtig, dass alle standardmäßig dieselbe Instanz verwenden (die Änderung lautet: Verwenden Sie anstelle einer Factory eine statische Instanz Methoden zum externen Festlegen der allgemeinen Instanz und zum Verwenden dieser Instanz während der Erstellung).
Meustrus
Der Vorteil dieses Ansatzes besteht also im Wesentlichen darin, dass Sie nur eine Objektinstanz (die Factory) und möglicherweise eine ganze Reihe von Objekten (für die Sie keine Singletons verwenden möchten) mischen müssen.
Hari Karam Singh
9

Spring oder irgendein anderer IoC-Container leistet dabei einigermaßen gute Arbeit. Da die Klassen außerhalb der App selbst erstellt und verwaltet werden, kann der Container einfache Klassen-Singletons erstellen und bei Bedarf einfügen.

Kai
quelle
Haben Sie Links zu den oben genannten Themen?
CodingWithoutComments
Diese Frameworks scheinen spezifisch für Java zu sein - gibt es noch andere sprachspezifische Optionen? Oder sprachunabhängig?
CodingWithoutComments
für .NET: Castle Windsor schlossproject.org/container/index.html Microsoft Unity msdn.microsoft.com/en-us/library/cc468366.aspx Unity ist eigentlich ein Abhängigkeitsinjektionsframework, aber es wird wahrscheinlich für dieses Thema funktionieren.
Erik van Brakel
1
Warum gibt es dafür nicht zu viele Stimmen? IOC ist die perfekte Lösung, um Singleton zu vermeiden.
Sandeep Jindal
@CodingWithoutComments Ich weiß, dass PHP den Symfony Service Container hat. Die Ruby-Typen haben jedoch andere Möglichkeiten, Abhängigkeiten einzufügen. Haben Sie eine bestimmte Sprache, die Sie interessiert?
Bevelopper
9

Sie sollten nicht aus dem Weg gehen müssen, um Muster zu vermeiden. Die Verwendung eines Musters ist entweder eine Entwurfsentscheidung oder eine natürliche Anpassung (es passt einfach zusammen). Wenn Sie ein System entwerfen, haben Sie die Wahl, entweder ein Muster zu verwenden oder das Muster nicht zu verwenden. Sie sollten sich jedoch nicht die Mühe machen, alles zu vermeiden, was letztendlich eine Designentscheidung ist.

Ich vermeide das Singleton-Muster nicht. Entweder ist es angemessen und ich benutze es oder es ist nicht angemessen und ich benutze es nicht. Ich glaube, dass es so einfach ist.

Die Angemessenheit (oder das Fehlen davon) des Singleton hängt von der Situation ab. Es ist eine Entwurfsentscheidung, die getroffen werden muss, und die Konsequenzen dieser Entscheidung müssen verstanden (und dokumentiert) werden.

Thomas Owens
quelle
Ich wollte das Gleiche sagen, aber es beantwortet seine Frage nicht ganz :)
Swati
2
Bitte sprechen Sie in Ihrer Antwort darüber, wann dies angemessen oder nicht angemessen ist. Bitte schön.
CodingWithoutComments
Es beantwortet die Frage. Ich habe keine Techniken, um die Verwendung des Singleton-Musters zu vermeiden, da ich mir nicht die Mühe mache, dies zu vermeiden, und ich denke, kein Entwickler sollte dies tun.
Thomas Owens
Ich denke nicht, dass Sie verallgemeinern können, wann es angemessen ist oder nicht. Es ist alles projektspezifisch und hängt stark vom Design des betreffenden Systems ab. Für solche Entscheidungen verwende ich keine "Daumenregeln".
Thomas Owens
Hmm. Ich verstehe nicht, warum dies abgelehnt wird. Ich beantwortete die Frage: Was sind Ihre Techniken, um die Verwendung des Singleton-Musters zu vermeiden? - indem ich sage, dass ich keine Techniken habe, weil ich mir nicht die Mühe mache, das Muster zu vermeiden. Könnten die Downvoter ihre Argumentation näher erläutern?
Thomas Owens
5

Monostate (beschrieben in Robert C. Martins Agile Software Development) ist eine Alternative zu Singleton. In diesem Muster sind die Daten der Klasse alle statisch, aber die Getter / Setter sind nicht statisch.

Beispielsweise:

public class MonoStateExample
{
    private static int x;

    public int getX()
    {
        return x;
    }

    public void setX(int xVal)
    {
        x = xVal;
    }
}

public class MonoDriver
{
    public static void main(String args[])
    {
        MonoStateExample m1 = new MonoStateExample();
        m1.setX(10);

        MonoStateExample m2 = new MonoStateExample();
        if(m1.getX() == m2.getX())
        {
            //singleton behavior
        }
    }
}

Monostate verhält sich ähnlich wie Singleton, jedoch so, dass der Programmierer nicht unbedingt weiß, dass ein Singleton verwendet wird.

Mark M.
quelle
Dies verdient mehr Stimmen; Ich bin von Google hierher gekommen und habe nach einer MonoState-Auffrischung gesucht!
Mahemoff
@Mark Es scheint mir, dass dieses Design in Bezug auf die Gewindesicherheit sehr schwer zu verriegeln ist. Erstelle ich eine Instanzsperre für jede statische Variable in MonoStateExample oder erstelle ich eine Sperre, die alle Eigenschaften nutzen? Beide haben schwerwiegende Folgen, die leicht gelöst werden können und in einem Singleton-Muster ausgeführt werden.
Martin Bliss
Dieses Beispiel ist eine Alternative zum Singleton-Muster, löst jedoch keine Probleme des Singleton-Musters.
Sandeep Jindal
4

Das Singleton- Muster existiert, weil es Situationen gibt, in denen ein einzelnes Objekt benötigt wird, um eine Reihe von Diensten bereitzustellen .

Selbst wenn dies der Fall ist, halte ich den Ansatz, Singletons mithilfe eines globalen statischen Felds / einer globalen statischen Eigenschaft, die die Instanz darstellt, zu erstellen , für unangemessen. Dies ist unangemessen, da im Code eine Abhängigkeit zwischen dem statischen Feld und dem Objekt entsteht, nicht zwischen den Diensten, die das Objekt bereitstellt.

Anstelle des klassischen Singleton-Musters empfehle ich daher, das Service-Like-Muster für Serviced Container zu verwenden. Wenn Sie Ihren Singleton nicht über ein statisches Feld verwenden, erhalten Sie einen Verweis darauf über eine Methode, die den erforderlichen Servicetyp anfordert.

*pseudocode* currentContainer.GetServiceByObjectType(singletonType)
//Under the covers the object might be a singleton, but this is hidden to the consumer.

statt einzeln global

*pseudocode* singletonType.Instance

Auf diese Weise haben Sie es leicht, wenn Sie den Typ eines Objekts von Singleton in etwas anderes ändern möchten. Als zusätzlichen Vorteil müssen Sie nicht alle Objektinstanzen an jede Methode weitergeben.

Siehe auch Inversion of Control . Die Idee ist, dass Sie durch direktes Aussetzen von Singletons für den Verbraucher eine Abhängigkeit zwischen dem Verbraucher und der Objektinstanz erstellen, nicht zwischen den vom Objekt bereitgestellten Objektdiensten.

Meine Meinung ist, die Verwendung des Singleton-Musters nach Möglichkeit zu verbergen , da es nicht immer möglich oder wünschenswert ist, es zu vermeiden.

Pop Catalin
quelle
Ich folge Ihrem Beispiel für gewartete Container nicht ganz. Haben Sie Online-Ressourcen, auf die Sie verlinken können?
CodingWithoutComments
Schauen Sie sich "Castle Project - Windsor Container" an. Castleproject.org/container/index.html . Leider ist es sehr schwierig, abstrakte Veröffentlichungen zu diesem Thema zu finden.
Pop Catalin
2

Wenn Sie einen Singleton zur Darstellung eines einzelnen Datenobjekts verwenden, können Sie stattdessen ein Datenobjekt als Methodenparameter übergeben.

(obwohl ich behaupten würde, dass dies der falsche Weg ist, einen Singleton überhaupt zu verwenden)

David Koelle
quelle
1

Wenn Ihr Problem darin besteht, dass Sie den Status beibehalten möchten, möchten Sie eine MumbleManager-Klasse. Bevor Sie mit einem System arbeiten, erstellt Ihr Client einen MumbleManager, wobei Mumble der Name des Systems ist. Der Staat bleibt dadurch erhalten. Möglicherweise enthält Ihr MumbleManager eine Eigenschaftstasche, die Ihren Status enthält.

Diese Art von Stil fühlt sich sehr C-artig und nicht sehr objektartig an - Sie werden feststellen, dass Objekte, die Ihr System definieren, alle einen Verweis auf denselben MumbleManager haben.

Sockel
quelle
Ohne für oder gegen Singleton einzutreten, muss ich sagen, dass diese Lösung ein Anti-Muster ist. MumbleManager wird zu einer "Gottklasse", die alle Arten von unterschiedlichem Wissen enthält und die Einzelverantwortung verletzt. Es kann auch ein Singleton für alle Anwendungsinteressen sein.
Martin Bliss
0

Verwenden Sie ein einfaches Objekt und ein Factory-Objekt. Die Fabrik ist dafür verantwortlich, die Instanz und die einfachen Objektdetails nur mit den Konfigurationsinformationen (die sie beispielsweise enthält) und dem Verhalten zu überwachen.

David
quelle
1
Ist eine Fabrik nicht oft ein Singleton? So sehe ich normalerweise die implementierten Factory-Muster.
Thomas Owens
0

Wenn Sie beim Vermeiden von Singeltons von Grund auf neu entwerfen, müssen Sie möglicherweise nicht umgehen, indem Sie Singletons nicht mithilfe statischer Variablen verwenden. Wenn Sie statische Variablen verwenden, erstellen Sie auch mehr oder weniger einen Singleton. Der einzige Unterschied besteht darin, dass Sie verschiedene Objektinstanzen erstellen. Intern verhalten sich jedoch alle so, als würden sie einen Singleton verwenden.

Können Sie vielleicht ein detailliertes Beispiel geben, wo Sie einen Singleton verwenden oder wo derzeit ein Singleton verwendet wird und Sie versuchen, die Verwendung zu vermeiden? Dies könnte den Menschen helfen, eine ausgefallenere Lösung zu finden, wie die Situation ohne einen Singleton überhaupt gehandhabt werden könnte.

Übrigens habe ich persönlich keine Probleme mit Singletons und ich kann die Probleme, die andere Leute in Bezug auf Singletons haben, nicht verstehen. Ich sehe nichts schlechtes an ihnen. Das heißt, wenn Sie sie nicht missbrauchen. Jede nützliche Technik kann missbraucht werden und wenn sie missbraucht wird, führt dies zu negativen Ergebnissen. Eine andere Technik, die häufig missbraucht wird, ist die Vererbung. Trotzdem würde niemand sagen, dass Vererbung etwas Schlimmes ist, nur weil manche Leute es schrecklich missbrauchen.

Mecki
quelle
0

Persönlich ist für mich eine viel sinnvollere Möglichkeit, etwas zu implementieren, das sich wie Singleton verhält, die Verwendung einer vollständig statischen Klasse (statische Elemente, statische Methoden, statische Eigenschaften). Die meiste Zeit implementiere ich es auf diese Weise (ich kann mir keine Verhaltensunterschiede aus Anwendersicht vorstellen)

user18834
quelle
0

Ich denke, der beste Ort, um den Singleton zu überwachen, ist das Design der Klasse. Zu diesem Zeitpunkt sollten Sie in der Lage sein, die Interaktionen zwischen Klassen abzubilden und festzustellen, ob etwas absolut erforderlich ist, dass zu jedem Zeitpunkt des Anwendungslebens nur eine Instanz dieser Klasse vorhanden ist.

Wenn dies der Fall ist, haben Sie einen Singleton. Wenn Sie Singletons als Annehmlichkeit beim Codieren einwerfen, sollten Sie Ihr Design wirklich überdenken und auch aufhören, diese Singletons zu codieren :)

Und ja, "Polizei" ist das Wort, das ich hier meinte, anstatt "zu vermeiden". Der Singleton ist nicht zu vermeiden (genauso wie goto und globale Variablen nicht zu vermeiden sind). Stattdessen sollten Sie die Verwendung überwachen und sicherstellen, dass dies die beste Methode ist, um das, was Sie möchten, effektiv zu erledigen.

workmad3
quelle
1
Ich verstehe vollkommen, was du sagst, Workmad. Und ich stimme vollkommen zu. Ihre Antwort beantwortet meine Frage jedoch immer noch nicht speziell. Ich wollte nicht, dass dies eine weitere Frage ist: "Wann ist es angemessen, den Singleton zu verwenden?" Ich war nur an brauchbaren Alternativen zum Singleton interessiert.
CodingWithoutComments
0

Ich benutze Singleton meistens als "Methodencontainer", ohne Status. Wenn ich diese Methoden mit vielen Klassen teilen muss und die Last der Instanziierung und Initialisierung vermeiden möchte, erstelle ich einen Kontext / eine Sitzung und initialisiere alle Klassen dort. Alles, was sich auf die Sitzung bezieht, hat auch Zugriff auf den darin enthaltenen "Singleton".

Manrico Corazzi
quelle
0

Da ich nicht in einer stark objektorientierten Umgebung (z. B. Java) programmiert habe, bin ich nicht ganz über die Feinheiten der Diskussion informiert. Aber ich habe ein Singleton in PHP 4 implementiert. Ich habe es getan, um einen 'Black-Box'-Datenbankhandler zu erstellen, der automatisch initialisiert wurde und nicht in einem unvollständigen und etwas kaputten Framework an Funktionsaufrufe weitergeleitet werden musste.

Nachdem ich einige Links von Singleton-Mustern gelesen habe, bin ich mir nicht ganz sicher, ob ich es wieder auf die gleiche Weise implementieren würde. Was wirklich benötigt wurde, waren mehrere Objekte mit gemeinsam genutztem Speicher (z. B. das eigentliche Datenbankhandle), und genau das wurde aus meinem Aufruf.

Wie bei den meisten Mustern und Algorithmen ist die Verwendung eines Singletons "nur weil es cool ist" The Wrong Thing To Do. Ich brauchte einen echten Black-Box-Anruf, der einem Singleton sehr ähnlich sah. Und IMO ist der Weg, um die Frage anzugehen: Seien Sie sich des Musters bewusst, aber schauen Sie sich auch den weiteren Umfang an und auf welcher Ebene die Instanz eindeutig sein muss.

staticsan
quelle
-1

Was meinst du, was sind meine Techniken, um es zu vermeiden?

Um dies zu "vermeiden", bedeutet dies, dass es viele Situationen gibt, in denen das Singleton-Muster von Natur aus gut passt, und dass ich daher einige Maßnahmen ergreifen muss, um diese Situationen zu entschärfen.

Aber es gibt keine. Ich muss das Singleton-Muster nicht vermeiden. Es entsteht einfach nicht.

DrPizza
quelle