576 Stimmen

Dependency Injection vs. Factory Pattern

Die meisten der Beispiele, die für die Verwendung von Dependency Injection angeführt werden, können wir auch mit dem Factory Pattern lösen. Es sieht so aus, als ob der Unterschied zwischen Dependency Injection und Factory bei der Verwendung/Entwicklung verschwommen oder dünn ist.

Jemand hat mir einmal gesagt, dass es darauf ankommt, wie man es benutzt!

Ich habe einmal StructureMap einen DI-Container, um ein Problem zu lösen. Später habe ich ihn so umgestaltet, dass er mit einer einfachen Fabrik funktioniert und die Verweise auf StructureMap entfernt.

Kann mir jemand sagen, was der Unterschied zwischen ihnen ist und wo was zu verwenden ist, was die beste Praxis hier?

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?

3voto

neleus Punkte 2082

Die meisten Antworten erklären den konzeptionellen Unterschied und die Einzelheiten der Umsetzung beider Konzepte. Allerdings war ich nicht in der Lage, Erklärung über den Unterschied in der Anwendung, die IMO ist die wichtigste und der OP gefragt zu finden. Also lassen Sie mich dieses Thema erneut eröffnen...

Jemand hat mir einmal gesagt, dass es darauf ankommt, wie man es benutzt!

Ganz genau. In 90 % der Fälle können Sie eine Objektreferenz entweder mit Factory oder DI erhalten, und in der Regel verwenden Sie letzteres. In weiteren 10% der Fälle ist die Verwendung von Factory der einzig richtige Weg . Diese Fälle umfassen den Erhalt von Objekten durch Variable bei Laufzeitparametern. Zum Beispiel so:

IWebClient client = factoryWithCache.GetWebClient(url: "stackoverflow.com",
        useCookies: false, connectionTimeout: 120);

In diesem Fall wird client von DI ist nicht möglich (oder erfordert zumindest eine unschöne Umgehung). Als allgemeine Entscheidungsregel gilt also: Wenn eine Abhängigkeit ohne zur Laufzeit berechnete Parameter erhalten werden kann, ist DI vorzuziehen, andernfalls ist Factory zu verwenden.

3voto

Sie können einen Blick werfen auf ce lien für einen Vergleich der beiden (und anderer) Ansätze in einem realen Beispiel.

Wenn sich die Anforderungen ändern, müssen Sie mehr Code ändern, wenn Sie Factories anstelle von DI verwenden.

Dies gilt auch für manuelle DI (d.h. wenn es kein externes Framework gibt, das die Abhängigkeiten zu Ihren Objekten bereitstellt, sondern Sie sie in jedem Konstruktor übergeben).

2voto

Anand Vemula Punkte 288

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.

2voto

suhas tangadle Punkte 41

Sie verwenden Dependency Injection, wenn Sie genau wissen, welche Art von Objekten Sie zu diesem Zeitpunkt benötigen. Im Falle des Fabrikmusters delegieren Sie den Prozess der Objekterstellung an die Fabrik, da Sie nicht genau wissen, welche Art von Objekten Sie benötigen.

2voto

harshit Punkte 7775

Ich glaube, dass DI eine Möglichkeit ist, eine Bean zu konfigurieren oder zu instanziieren. Die DI kann auf viele Arten erfolgen, wie Konstruktor, Setter-Getter usw.

Factory Pattern ist nur eine andere Art der Instanziierung von Beans. Dieses Pattern wird vor allem dann verwendet, wenn Sie Objekte mit Hilfe von Factory Design Pattern erstellen müssen, da Sie bei Verwendung dieses Patterns die Eigenschaften einer Bean nicht konfigurieren, sondern nur das Objekt instanziieren.

Prüfen Sie diesen Link: Injektion von Abhängigkeiten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X