Builder-Muster vs. Dependency Injection (zum Beispiel über Guice)

8

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(...)} ?

    
Johannes 20.09.2012, 20:46
quelle

3 Antworten

12

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

  • benannte Konstruktionslogik ist erwünscht. Z. B. Lists.newArrayList()
  • Die Konstruktion ist so kompliziert, dass sie nicht in die Klasse selbst gehört
  • es ist keine Konfiguration der Fabrik erforderlich, und die Fabrik hat keine Nebenwirkungen

Betrachten Sie instance factories wenn

  • Es gibt eine komplexe Instanziierungslogik
  • Konfiguration der Fabrik wird benötigt
  • mit AbstractFactory Designmuster
  • Es müssen während des gesamten Programmlebenszyklus zusätzliche Objekte erstellt werden

Betrachten Sie eine builder wenn

  • gibt es komplexe Parameterauswahlmöglichkeiten. Z. B. 5 Parameter, wobei einige optional sind.

(*) 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.

    
Johan Sjöberg 20.09.2012, 21:05
quelle
10
  

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.

    
Cratylus 20.09.2012 21:23
quelle
0

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.

    
user3038723 04.03.2015 20:10
quelle