Meiner Meinung nach gibt es 3 wichtige Aspekte, die die Objekte und ihre Verwendung bestimmen:
1. Instanziierung (einer Klasse zusammen mit einer eventuellen Initialisierung).
2. Einspritzung (der so geschaffenen Instanz), wo es erforderlich ist.
3. Lebenszyklus-Management (der so geschaffenen Instanz).
Mit dem Factory-Muster wird der erste Aspekt (Instanziierung) erreicht, aber die beiden anderen sind fraglich. Die Klasse, die andere Instanzen verwendet, muss die Fabriken fest codieren (anstatt Instanzen zu erstellen), was die Fähigkeit zur losen Kopplung behindert. Außerdem, Lebenszyklusmanagement von Instanzen wird in einer großen Anwendung, in der eine Fabrik an mehreren Stellen verwendet wird, zu einer Herausforderung (insbesondere, wenn die Fabrik den Lebenszyklus der von ihr zurückgegebenen Instanz nicht verwaltet, wird es unschön).
Bei der Verwendung einer DI (des IoC-Musters) hingegen werden alle 3 außerhalb des Codes abstrahiert (zum DI-Container) und die verwaltete Bohne braucht nichts von dieser Komplexität. Lose Kopplung kann ein sehr wichtiges architektonisches Ziel ganz bequem erreicht werden. Ein weiteres wichtiges architektonisches Ziel, die Trennung der Konzerne viel besser erreicht werden kann als in Fabriken.
Während die Fabriken für kleine Anwendungen geeignet sein können, sollten große Anwendungen lieber DI als Fabriken wählen.
27 Stimmen
Können sich diese beiden Ansätze nicht gegenseitig ergänzen, indem man Dependency Injection zur Injektion von Fabrikklassen verwendet?
21 Stimmen
Es wäre wirklich schön, wenn diese Frage mit einem Code beantwortet werden könnte! Ich sehe immer noch nicht, wie DI vorteilhaft/unterschiedlich von der Verwendung einer Fabrik für die Erstellung sein würde? Sie müssen nur diese eine Zeile in der Fabrikklasse ersetzen, um zu ändern, welches Objekt/Implementierung erstellt wird?
2 Stimmen
@gideon würde das nicht dazu führen, dass Sie Ihre Anwendung kompilieren müssen, oder zumindest das Modul, das die Fabrikklasse enthält?
1 Stimmen
@liortal Ja, das ist richtig. Habe eine lange Studie über DI seit diesem Kommentar und jetzt verstehe ich die DI nimmt die Fabrik-Methode einen Schritt voraus.
1 Stimmen
Sehen Sie sich diese großartige Antwort an: stackoverflow.com/questions/4985455/ - er formuliert es sehr gut und liefert Codebeispiele.
0 Stimmen
Haben Sie jemals eine Anwendung von Dependency Injection gesehen, die keine Factories verwendet hat? Das wäre seltsam, da Dependency Injection bedeutet, dass der Code zur Erstellung eines Objekts an einer einzigen Stelle platziert wird, was die gesamte Komplexität/Abstraktion/den ganzen Overhead einer Factory mit sich bringt. Wäre es nicht dumm, DI zu verwenden, aber keine Fabriken?
0 Stimmen
Falls jemand daran interessiert ist, wie Dependency Injection in einem Coffeeshop-Theme hilfreich sein kann, habe ich hier einen Artikel darüber geschrieben: digigene.com/design-patterns/dependency-injection-coffeeshop
0 Stimmen
Die Antwort mit den meisten Stimmen macht keinen Sinn. Das Factory Design Pattern verwendet das Prinzip der Abhängigkeitsinversion, das die Instanziierung des Codes in eine andere Klasse auslagert, daher macht seine Antwort keinen Sinn.
0 Stimmen
Um eine gute Dependency Injection zu machen, müssen Sie sich auf Factories verlassen, die es Ihnen erlauben, eine Composition Root zu machen, eine obere Schicht, die alle Ihre entkoppelten Komponenten zusammen verdrahtet, die zu Ihrem Implementierungsfall passen, Sie können einen Blick auf die Di-Ninja Bibliothek werfen, dies ist ein gutes Beispiel für Quellcode, um die Ziele der Dependency Injection zu erklären github.com/di-ninja/di-ninja