2009-09-30 7 views

Antwort

22

Jede Klasse kann eine Schnittstelle implementieren, und ein Singleton ist nur eine "normale" Klasse, die sicherstellt, dass zu jeder Zeit nur eine Instanz existiert, abgesehen von der anderen Geschäftslogik, die sie implementiert. Dies bedeutet auch, dass ein Singleton mindestens 2 Verantwortlichkeiten hat und das ist kein gutes OO-Design, da Klassen nur 1 Verantwortung haben sollten und sicherstellen, dass sie gut in dieser Verantwortung sind, aber das ist eine andere Diskussion.

+0

Warum ein Singleton ist nicht gut OO-Design? In der Tat ist einer der häufigsten OO-Entwurfsmuster –

+2

@ChristianVielma: (Ja, spät) Das Problem ist, es erstellt * globalen Zustand *, genau wie * globale Variablen *, und leidet unter ähnlichen Problemen. Zum Beispiel ist es schwierig, Klassen zu testen, die intern Singles ohne Fremdwissen anfordern. Ihre Produktions-DB ist voll mit Müll/Testdaten? Überprüfen Sie auf Singletons. Jagd auf einen Käfer? Wenn Sie Singletons und damit einen globalen Zustand haben, können Sie sich nicht auf einen begrenzten Bereich konzentrieren. Sie müssen die Code-Basis berücksichtigen. Danke einem Singleton. Beachten Sie, dass es sich hierbei um das Singleton * -Muster * und nicht um Singleton * -Objekte * handelt. Gemeinsame Nutzung bedeutet nicht, dass es "gut" sein muss. – ray

0

Ein Singleton hat eine Instanz - es hat nie mehr als eine Instanz. Sie verwenden wahrscheinlich ein paar statische Member zum Referenzabruf und um sicherzustellen, dass es niemals mehrere Instanzen erhält, aber die Klasse ist größtenteils dieselbe wie jede andere Klasse.

10

Etwas wie:

public interface MyInterface 
{ 
} 

Und

public class MySingleton implements MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+2

Sie müssen dieser Klasse einen privaten No-Args-Konstruktor hinzufügen, um sie zu einem Singleton zu machen. –

+7

FYI, der beste Weg in Java, ein Singleton zu implementieren, ist die Verwendung einer Single-Element-Enumeration.Es ist prägnanter als der öffentliche Feldansatz und es bietet den Serialisierungsmechanismus kostenlos und es bietet auch Sicherheit gegen Reflektionsangriffe. Diese Methode muss noch weitgehend übernommen werden, aber es könnte interessant sein zu wissen. Für weitere Informationen siehe den Artikel darüber in "Effective Java" von Joshua Bloch. – nkr1pt

+0

@Andrew: danke, ich habe zwischen SO und dem Tagesjob gepunktet und das zufällig verpasst :-) –

0

Grundsätzlich ist eine Singleton-Klasse eine Klasse, die eine und einmal instanziiert werden kann nur. Das Singleton-Klassenmuster wird mithilfe einer statischen Methode implementiert, um die Instanz der Singleton-Klasse abzurufen und den Zugriff auf die Konstruktoren zu beschränken.

Wie bei der Verwendung einer Schnittstelle wäre es ähnlich wie jede andere Klasse eine Schnittstelle implementieren würde.

Und es sollte auch nicht das Klonen dieses Objekts ermöglichen.

5

Ich glaube, ich habe dein Problem verstanden. Sie möchten die Factory-Methode in der Schnittstelle definieren (statische Methode zu getInstance()). Da die Factory-Methode jedoch nicht in der Schnittstelle definiert werden kann, funktioniert diese Logik nicht.

Eine Option ist eine Factory-Klasse, die diese statische Methode enthält. So wird es drei Klassen erste Klasse statische Methode Sekunde zu halten, ist die Schnittstelle dritte ist die konkrete Klasse

Aber wir können nicht den konkreten Konstruktor privat machen.

Aber wenn Ihre Infrastruktur zwei Pakete eines für die öffentlichen und die anderen für private

definiert Schnittstelle in der Öffentlichkeit hat, konkrete Klasse Paketebene machen (ohne jede Zugriffsmodifikator) und Factory-Klasse und statische Methode öffentlich.

Ich hoffe, das könnte Ihnen helfen.

Verwandte Themen