Ich weiß nicht, wo ich if
/ switch
setzen soll, wenn ich die zu instanziierende Implementierung / Unterklasse auswähle, besonders wenn man bedenkt, dass Interfaces jetzt statische Methoden haben können.
Nehmen wir an, ich habe einen Service, einen Typ, der durch eine Schnittstelle und einige Implementierungen definiert wird. Ich schätze, es wäre besser, diese Logik nicht in den Dienst zu stellen, sondern die Fabrikmethode zu verwenden. Aber sollte es in der Schnittstelle oder in einer anderen Klasse mit einer Param-to-Type-Karte gehen, wie in dieser Antwort vorgeschlagen?
>Es scheint mir natürlich, es in die Schnittstelle zu setzen:
%Vor%und dann rufen Sie einfach aus dem Service:
%Vor%Aber ich weiß nicht, ob es schlecht ist, dass die Schnittstelle über ihre Implementierung Bescheid weiß, oder dass eine Elternklasse über ihre Subtypen Bescheid weiß. Also
Benutze Factory
dafür. Auf diese Weise können Sie single responsibility principle
beibehalten. In einem meiner eigenen Projekte definiert interface
jedoch eine Methode, die bestimmt, für welche Art von Argument diese spezielle Implementierung verwendet werden soll. Dank dessen und mit Reflections
wird der gesamte Prozess automatisiert. Reflections
findet alle Klassen, die die angegebene interface
implementiert haben, und speichert ihren 'Verwendungstyp' in einer Map für eine schnelle Suche. Dank einer solchen Lösung muss der Entwickler nur dann eine neue Implementierung erstellen, wenn er sie benötigt. In anderen Teilen des Systems sind keine weiteren Änderungen erforderlich, auch nicht in der Fabrikklasse.
Reflections
hat eine nette Funktion, um Metadaten zur Kompilierzeit zu speichern, so dass die Laufzeitsuche für die richtigen Klassen nur ein Wimpernschlag ist
Es gibt eine ganze Reihe von Lösungen für Ihr Problem, ich denke, Sie kennen viele von ihnen bereits.
Das statische Fabrikmethodenmuster
%Vor%Das funktioniert, aber es macht die Trennung von Schnittstelle und Implementierung schwierig. Die Schnittstelle muss alle möglichen Implementierungen kennen und ist nicht besonders erweiterbar. Um eine neue Implementierung hinzuzufügen, müssen Sie die Schnittstelle ändern.
Fabrikmuster
Dies ist mehr oder weniger alt-Schule von dem Buch GOF:
%Vor%Damit können Sie die Fabrik (und sogar Stapelfabriken) ersetzen. Es hat - allerdings - den Nachteil, dass Sie das Fabrikobjekt umgehen müssen. Beachten Sie, dass Sie mit Java 8 auch sehr leichte Lambda-basierte Factorys verwenden können (siehe Ссылка )
Container
Eine andere Lösung, obwohl sie ziemlich schwer sein kann, besteht darin, die Konstruktion des Objekts einem Behälterrahmen zu überlassen. In diesen Fällen stellt der Container Ihre Objektfactory bereit. Der tatsächliche Objekttyp wird der Konfiguration überlassen. Spring und Java EE machen das ziemlich gut. Kombinieren Sie auch Abhängigkeitsinjektion für zusätzlichen Effekt.
Das sind zumindest die, die ich mir vorstellen kann.
Tags und Links java inheritance interface-implementation