Theorie
Es gibt zwei wichtige Punkte zu beachten:
- Wer schafft Objekte:
- [Fabrik]: Sie müssen schreiben, WIE das Objekt erstellt werden soll. Sie haben eine separate Factory-Klasse, die die Erstellungslogik enthält.
- [Dependency Injection]: In praktischen Fällen wird dies von externen Frameworks durchgeführt (in Java wäre das z.B. spring/ejb/guice). Die Injektion geschieht "auf magische Weise" ohne explizite Erstellung neuer Objekte.
- Welche Art von Objekten es verwaltet:
- [Fabrik]: Normalerweise verantwortlich für die Erstellung von zustandsabhängigen Objekten
- [Dependency Injections]: Eher zustandslose Objekte erstellen
Praktisches Beispiel für die Verwendung von Factory und Dependency Injection in einem einzigen Projekt
- Was wir bauen wollen
Anwendungsmodul zur Erstellung von Aufträgen, die mehrere Einträge enthalten, genannt Auftragszeile.
- Architektur
Nehmen wir an, wir wollen die folgende Schichtenarchitektur erstellen:
![enter image description here]()
Domänenobjekte können Objekte sein, die in der Datenbank gespeichert sind. Das Repository (DAO) hilft beim Abrufen von Objekten aus der Datenbank. Dienst bietet API für andere Module. Ermöglicht Operationen auf order
Modul.
- Domänenebene und Verwendung von Fabriken
Die Entitäten, die sich in der Datenbank befinden werden, sind Order und OrderLine. Ein Auftrag kann mehrere Auftragszeilen haben. ![Relationship between Order and OrderLine]()
Jetzt kommt der wichtige Teil der Gestaltung. Sollen Module außerhalb dieses Moduls selbständig OrderLines erstellen und verwalten? Nein. Eine Auftragszeile sollte nur existieren, wenn ein Auftrag mit ihr verbunden ist. Es wäre am besten, wenn Sie die interne Implementierung vor externen Klassen verbergen könnten.
Aber wie erstellt man eine Bestellung ohne Wissen über OrderLines?
Fabrik
Jemand, der eine neue Bestellung erstellen möchte, verwendet OrderFactory (die Details über die Tatsache, wie wir eine Bestellung erstellen, verbergen wird).
![enter image description here]()
So sieht es dann in einer IDE aus. Klassen außerhalb der domain
Paket verwendet OrderFactory
anstelle des Konstruktors innerhalb Order
.
- Injektion von Abhängigkeiten Dependency Injection wird häufiger bei zustandslosen Schichten wie Repository und Service verwendet.
OrderRepository und OrderService werden durch das Dependency Injection Framework verwaltet. Das Repository ist für die Verwaltung von CRUD-Operationen in der Datenbank zuständig. Der Dienst injiziert das Repository und verwendet es zum Speichern/Finden der richtigen Domänenklassen.
![enter image description here]()
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