Frage Wann wird ein Konstruktor verwendet und wann wird getInstance () -Methode (statische Factory-Methode) verwendet?


  1. Wann und wie sollten wir einen Konstruktor verwenden?

    Foo bar = new Foo();
    
  2. Und wann und wie sollten wir getInstance () verwenden (statische Factory-Methoden)

    Foo bar = Foo.getInstance();
    

Was ist der Unterschied zwischen diesen beiden, ich benutze immer den 1. Weg, aber wann den 2. Weg zu benutzen?


76
2017-07-02 22:03


Ursprung


Antworten:


Jeder scheint sich auf Singletons zu konzentrieren, während ich denke, dass es um die Frage geht Konstruktor vs statische Fabrikmethoden.

Das ist eigentlich Punkt 1: Berücksichtigen Sie statische Factory-Methoden anstelle von Konstruktoren von Wirksames Java von Joshua Bloch:

Punkt 1: Berücksichtigen Sie statische Factory-Methoden anstelle von Konstruktoren

Der normale Weg für eine Klasse, um a zu erlauben   Client, um eine Instanz von sich zu erhalten   ist es, einen öffentlichen Konstruktor zur Verfügung zu stellen.   Es gibt eine andere Technik, die sollte   Sei ein Teil von jedem Programmierer   Werkzeugkasten. Eine Klasse kann eine Öffentlichkeit bereitstellen    statische Fabrikmethode, das ist einfach eine statische Methode, die ein zurückgibt   Instanz der Klasse. Hier ist ein einfaches   Beispiel aus Boolean (die boxte   primitive Klasse für den primitiven Typ    boolean). Diese Methode übersetzt a   Boolescher primitiver Wert in a    Boolean Objektreferenz:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

Beachten Sie, dass eine statische Factory-Methode ist   nicht das gleiche wie die Fabrikmethode   Muster aus Designmuster   [Gamma95, p. 107]. Die statische Fabrik   Methode in diesem Artikel beschrieben hat keine   direktes Äquivalent in Design   Muster.

Eine Klasse kann ihren Kunden zur Verfügung stellen   statische Factory-Methoden statt, oder   zusätzlich zu Konstruktoren.   Bereitstellung einer statischen Fabrikmethode   anstelle eines öffentlichen Konstruktors hat   Vor- und Nachteile.

Vorteile (Zitat des Buches):

  • Ein Vorteil von statischen Factory-Methoden ist, dass sie im Gegensatz zu Konstruktoren Namen haben.
  • Ein zweiter Vorteil der statischen Factory-Methoden besteht darin, dass sie im Gegensatz zu Konstruktoren nicht jedes Mal ein neues Objekt erstellen müssen, wenn sie aufgerufen werden.
  • Ein dritter Vorteil von statischen Factory-Methoden besteht darin, dass sie im Gegensatz zu Konstruktoren ein Objekt eines beliebigen Subtyps ihres Rückgabetyps zurückgeben können.
  • Ein vierter Vorteil von statischen Factory-Methoden ist, dass sie die Ausführlichkeit beim Erstellen parametrisierter Typinstanzen reduzieren.

Nachteile (noch zitiert das Buch):

  • Der Hauptnachteil der Bereitstellung von nur statischen Fabrikmethoden ist, dass Klassen ohne öffentliche oder geschützte Konstruktoren können nicht unterklassifiziert werden.
  • Ein zweiter Nachteil der statischen Factory-Methoden ist, dass sie nicht sind leicht von anderen statischen Methoden zu unterscheiden.

87
2017-07-02 23:16



Du hast zwei Fragen: Wann sollte ich? Anruf ein getInstance() Methode, und wann sollte ich erstellen ein?

Wenn Sie entscheiden, ob Sie anrufen möchten ein getInstance() Methode, es ist einfach. Sie müssen nur die Klassendokumentation lesen, um herauszufinden, wann Sie es aufrufen sollten. Beispielsweise, NumberFormat stellt einen Konstruktor zur Verfügung und ein getInstance() Methode; das getInstance() Methode wird Ihnen eine lokalisierte geben NumberFormat. Zum CalendarAuf der anderen Seite ist der Konstruktor geschützt. Sie haben anrufen getInstance() um eins zu bekommen.

Wenn Sie entscheiden, ob Sie erstellen möchten ein getInstance() Methode müssen Sie entscheiden, was Sie erreichen möchten. Entweder Sie nicht möchten, dass die Leute Ihren Konstruktor aufrufen (Sie erstellen ein Singleton oder ein Fabrik) oder es macht Ihnen nichts aus (wie in NumberFormat oben, wo sie einige Objekte für die Bequemlichkeit des Anrufers initialisieren.


Um es kurz zu machen? Mach dir keine Sorgen über das Erstellen getInstance() Methoden in Ihrem eigenen Code. Wenn die Zeit entsteht, wenn sie nützlich sein werden, werden Sie es wissen. Und im Allgemeinen, wenn Sie kann Rufen Sie den Konstruktor einer Klasse auf, was Sie wahrscheinlich tun sollten, auch wenn die Klasse ein getInstance() Methode.


7
2017-07-02 22:08



Die Verwendung für getInstance-Methoden:

Aber die meiste Zeit wird dein Objekt einfach sein POJO und die Verwendung öffentlicher Konstruktoren ist die praktischste und offensichtlichste Lösung.

U1: getInstance aus einer anderen Klasse

So geben Sie eine Instanz einer anderen Klasse zurück:

public class FooFactory {
    public static Foo getInstance() {
        return new Foo();
    }
}

NumberFormat.getInstance Methoden tun dies, da sie tatsächlich Instanzen von DecimalFormat.

U2: Singleton Probleme

Das Singleton-Muster beschränkt viele Vorteile der objektorientierten Programmierung. Singletons haben in der Regel private Konstrukteure, daher können Sie sie nicht erweitern. Da Sie über die Methode getInstance darauf zugreifen und keine Schnittstelle referenzieren, können Sie sie nicht für eine andere Implementierung austauschen.


7
2017-07-02 22:14



Wenn Sie beide verwenden können, klingt es wie ein schlecht umgesetzt Singleton-Muster.

Verwenden Sie die zweite Option, wenn Sie nur eine einzige Instanz der Klasse in Ihrem System haben wollen, und machen Sie den Konstruktor dann privat.

Verwenden Sie die erste, um mehrere Objekte der Klasse zu erstellen.

Aber geben Sie Ihrer Klasse nicht beide Möglichkeiten.

Achten Sie darauf, Singletons nicht zu sehr zu verwenden, sondern nur zu verwenden, wenn wirklich nur eine Instanz im System vorhanden sein sollte, da Sie sonst die Möglichkeiten der Wiederverwendung Ihrer Klasse in anderen Projekten einschränken würden. Es klingt interessant, in der Lage zu sein, getInstance überall in Ihrem Projekt aufzurufen, aber das macht es unklar, wer diese Instanz wirklich besitzt: niemand und / oder alle. Wenn Sie in einem Projekt viele Singletons haben, können Sie darauf wetten, dass das System (normalerweise) schlecht entworfen ist. Singletons sollten mit Vorsicht verwendet werden, es gelten die gleichen Hinweise wie für globale Variablen.


6
2017-07-02 22:04



Ein Fall, in dem ich immer eine statische Fabrik gegenüber einem normalen Konstruktor bevorzuge, ist, wenn ich weiß, dass die Objektkonstruktion langsam ist. Ich mache eine einfache Initialisierung auf Konstruktor, aber wenn ich etwas Schweres erstellen muss, verwende ich eine statische Methode und dokumentiere das Verhalten.


1
2018-05-11 09:43



Singletons sind böse. Die Probleme, die ich gesehen habe, betreffen nicht die Wiederverwendung oder Erweiterbarkeit eines Systems (obwohl ich sehen konnte, wie das passieren könnte), mehr, als dass ich nicht zählen kann, wie oft ich obskure Bugs in einem System gesehen habe System, die aus Singletons entstehen.

Wenn Sie einen Singleton verwenden müssen, stellen Sie sicher, dass der Bereich sehr eng ist, d. H. Begrenzen Sie die Anzahl der anderen Objekte in Ihrem System, die darüber Bescheid wissen.


0
2017-07-02 22:20