Ich entwickle eine einfache baumstrukturierte Datenbank und setze normalerweise Abhängigkeiten oder optionale Einstellungen über einen Builder (Builder-Muster). Nun bin ich mir nicht sicher, wann ich zum Beispiel Guice verwenden soll, wann ich das Builder-Muster verwenden und wann ich eine statische Factory-Methode anstelle des Konstruktors verwenden soll. Ich habe Effective Java schon mehrmals gelesen und ich denke, es werden mindestens einige Vorteile erwähnt, um den Konstruktor nicht freizulegen. Es ist Zeit erneut zu lesen; -)
Weißt du also Fälle, die klar unterscheidbar sind? Und sollte ich den Konstruktor nicht freilegen? Also schreibe zB in jedem Fall public static Foo getInstance(...) { return new Foo(...)}
?
Ich glaube fest daran, dass Sie für alles keine Abhängigkeitsinjektion benötigen.
Bei einem LookupService
wäre es natürlich inject a Dictionary
, so dass seine Implementierung durch Konfiguration ausgelagert werden kann.
Für eine Firewall
auf der anderen Seite. Es wäre natürlich, wenn er sein eigenes FireWallRules
erstellt, vielleicht durch ein geliefertes Factory
oder ein Builder
.
Als Richtlinie injizieren Sie, was Sie konfigurieren brauchen, injizieren Sie nicht automatisch alles andere.
Betrachten Sie eine static factory (*)
wenn
Lists.newArrayList()
Betrachten Sie instance factories
wenn
AbstractFactory
Designmuster Betrachten Sie eine builder
wenn
(*)
Statische Methoden sind nicht immer testbar und das Vorhandensein eines sollte meiner Meinung nach immer motiviert sein.
Ein typischer Anwendungsfall für eine Fabrik ist die Verringerung von Kopplung . Mit static factory
ist diese Fähigkeit komplett verloren.
Builder-Muster vs. Abhängigkeitsinjektion
Wie sind diese 2 in Ihrem Kopf vergleichbar? Das Builder-Muster wird verwendet, wenn Sie mit Klassen arbeiten müssen, deren Konstruktoren über eine überwältigende Anzahl von Parametern verfügen (möglicherweise optional) und dieses Muster Ihren Code leichter les- und schreibbar macht.
Dependency Injection ist ein Ansatz, der eine lockere Kopplung erleichtert, indem Abhängigkeiten von höheren Klassen zu niedrigeren Klassen aufgehoben werden. Z.B. Eine Klasse, die eine Verbindung zu einer Datenbank herstellen muss, erstellt nicht direkt eine Verbindung, sondern eine Verbindung wird "injiziert" und diese Verbindung kann in eine andere Datenbank ausgelagert werden, ohne den Code zu beeinflussen, der sie verwendet.
Ich habe angefangen, Builder für die meisten meiner Projekte zu verwenden und es stellt sich heraus, dass ich alle meine DI durch Builder und Singleton ersetzen kann.
ie:
%Vor%Mein Code ist viel einfacher zu verwalten ohne DI.
Tags und Links java dependency-injection guice