Ich habe eine Schnittstelle und ihre 2 Implementierungen sagen:
%Vor%Nun sieht der Aufrufer, der diese Schnittstelle verwendet, wie folgt aus:
%Vor%Fahrzeugtyp ist ein ENUM Das funktioniert gut. Aber kann ich da eine Schnittstelle dynamisch aufrufen, ohne dass ich eine Schnittstelle aufrufen kann? Hinzufügen von if-Anweisungen. Wenn ich in Zukunft ein anderes Fahrzeug unterstütze, muss ich eine if-Anweisung zusammen mit einer neuen Implementierung für die Schnittstelle hinzufügen. Wie kann ich das vermeiden?
Verwenden Sie das Factory-Muster. Hier sind einige Vorteile von der Verwendung: Ссылка
1) Das Factory Method Design Pattern entkoppelt die aufrufende Klasse von der Zielklasse, was zu weniger gekoppeltem und hochgradig kohärentem Code führt.
2) Das Factory-Muster in Java ermöglicht den Unterklassen die Bereitstellung einer erweiterten Version eines Objekts, da das Erstellen eines Objekts innerhalb der Factory flexibler ist als das direkte Erstellen eines Objekts im Client. Da der Client jederzeit auf der Schnittstellenebene arbeitet, können Sie die Implementierung verbessern und von Factory zurückkehren.
3) Ein weiterer Vorteil der Verwendung von Factory-Entwurfsmustern in Java besteht darin, dass die Konsistenz in Code gefördert wird, da jedes Objekt mit Factory erstellt wird und nicht auf einer anderen Clientseite mit einem anderen Konstruktor.
4) Code, der mit Factory-Entwurfsmustern in Java geschrieben wurde, ist ebenfalls leicht zu debuggen und zu beheben, da Sie eine zentralisierte Methode zur Objekterstellung haben und jeder Client Objekte von demselben Ort bekommt
Was Sie im Grunde implementieren, ist ein Factory-Muster, wie es in den anderen Antworten vorgeschlagen wird. Aber am Ende müssen Sie eine "if" - oder "switch" -Anweisung schreiben, um die Implementierung (oder Strategie) für Ihren Enum-Wert zu korrigieren. Aber wie Sie selbst erwähnt haben, müssten Sie dieses Auswahlmuster erweitern, wenn Sie einen Aufzählungswert hinzufügen oder entfernen. Sie können dies umgehen, indem Sie eine Karte wie folgt verwenden:
%Vor%Sie können Ihren ProcessorSelector dann konfigurieren, indem Sie eine Zuordnung mit allen Prozessorimplementierungen an den richtigen Enum-Wert übergeben (beachten Sie, dass ich die ImmutableMap von Guava verwendet habe, um die hashmap:
zu konstruieren) %Vor%Sie müssen Ihren ProcessorSelector nie wieder ändern, nur die Konstruktion / Konfiguration der Klasse. Man könnte sogar sagen, dass wir hier das Strategie-Muster implementiert haben. Diese Selektor-Klassen sind sehr häufig und wenn Sie das Gefühl haben, dass Sie sie häufig implementieren, könnten Sie sogar eine allgemeinere Implementierung verwenden. Ich habe dies kürzlich in einem Blogpost beschrieben: Ссылка
Tags und Links java