Ich weiß, dass diese Frage alt ist, aber ich möchte meine fünf Cent hinzufügen,
Ich denke, dass die Abhängigkeitsinjektion (DI) in vielerlei Hinsicht einem konfigurierbaren Factory Pattern (FP) ähnelt, und in diesem Sinne können Sie alles, was Sie mit DI tun können, mit einer solchen Factory tun.
Wenn Sie beispielsweise spring verwenden, haben Sie die Möglichkeit, Ressourcen automatisch zu verdrahten (DI) oder Folgendes zu tun:
MyBean mb = ctx.getBean("myBean");
Und dann verwenden Sie diese 'mb'-Instanz, um etwas zu tun. Ist das nicht ein Anruf bei einer Fabrik, die Ihnen eine Instanz zurückgibt?
Der einzige wirkliche Unterschied, den ich zwischen den meisten FP-Beispielen bemerke, besteht darin, dass Sie konfigurieren können, was "myBean" in einer XML-Datei oder einer anderen Klasse ist, und dass ein Framework als Factory funktioniert, aber ansonsten ist es dasselbe und Sie kann sicherlich eine Factory haben, die eine Konfigurationsdatei liest oder die Implementierung nach Bedarf erhält.
Und wenn Sie mich nach meiner Meinung fragen (und ich weiß, dass Sie es nicht getan haben), glaube ich, dass DI dasselbe tut, aber die Entwicklung nur komplexer macht, warum?
Zum einen müssen Sie zur Konfiguration selbst gehen, um zu wissen, welche Implementierung für jede Bean verwendet wird, die Sie automatisch mit DI verdrahten.
aber ... was ist mit dem Versprechen, dass Sie die Implementierung des von Ihnen verwendeten Objekts nicht kennen müssen? pfft! Ernsthaft? Wenn Sie einen solchen Ansatz verwenden ... sind Sie nicht derselbe, der die Implementierung schreibt? und selbst wenn Sie dies nicht tun, sehen Sie sich nicht fast die ganze Zeit an, wie die Implementierung das tut, was sie tun soll?
und zum einen spielt es keine Rolle, wie sehr Ihnen ein DI-Framework verspricht , dass Sie davon entkoppelte Dinge ohne Abhängigkeiten zu ihren Klassen erstellen. Wenn Sie ein Framework verwenden, erstellen Sie alles, was dazu gehört, wenn Sie müssen Ändern Sie den Ansatz oder den Rahmen, es wird keine leichte Aufgabe sein ... NIE! ... aber da Sie alles um dieses spezielle Framework herum aufbauen, anstatt sich Gedanken darüber zu machen, was die beste Lösung für Ihr Unternehmen ist, werden Sie dabei mit einem großen Problem konfrontiert sein.
Tatsächlich ist die einzige echte Geschäftsanwendung für einen FP- oder DI-Ansatz, die ich sehen kann, wenn Sie die zur Laufzeit verwendeten Implementierungen ändern müssen , aber zumindest die mir bekannten Frameworks erlauben Ihnen dies nicht. Sie müssen gehen Alles perfekt in der Konfiguration zur Entwicklungszeit und wenn Sie das brauchen, verwenden Sie einen anderen Ansatz.
Wenn ich also eine Klasse habe, die in zwei Bereichen in derselben Anwendung unterschiedliche Leistungen erbringt (z. B. zwei Unternehmen einer Holding), muss ich das Framework so konfigurieren, dass zwei verschiedene Beans erstellt werden, und meinen Code anpassen, um jeden zu verwenden. Ist das nicht dasselbe, als würde ich einfach so etwas schreiben:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
das gleiche wie das:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Und das:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
In jedem Fall müssen Sie etwas in Ihrer Anwendung ändern, egal ob Klassen oder Konfigurationsdateien, aber Sie müssen es tun und erneut bereitstellen.
Wäre es nicht schön, so etwas zu tun:
MyBean mb = (MyBean)MyFactory.get("mb");
Und auf diese Weise legen Sie den Code der Fabrik fest, um zur Laufzeit die richtige Implementierung zu erhalten, abhängig vom Unternehmen des protokollierten Benutzers? Nun, das wäre hilfreich. Sie können einfach ein neues JAR mit den neuen Klassen hinzufügen und die Regeln möglicherweise auch zur Laufzeit festlegen (oder eine neue Konfigurationsdatei hinzufügen, wenn Sie diese Option offen lassen), ohne Änderungen an vorhandenen Klassen vorzunehmen. Dies wäre eine dynamische Fabrik!
Wäre das nicht hilfreicher, als zwei Konfigurationen für jedes Unternehmen schreiben zu müssen und vielleicht sogar zwei verschiedene Anwendungen für jedes Unternehmen zu haben?
Sie können mir sagen, dass ich den Wechsel zur Laufzeit nie durchführen muss, also konfiguriere ich die App. Wenn ich die Klasse erbe oder eine andere Implementierung verwende, ändere ich einfach die Konfiguration und stelle sie erneut bereit. Ok, das kann man auch mit einer Fabrik machen. Und sei ehrlich, wie oft machst du das? Vielleicht nur, wenn Sie eine App haben, die irgendwo anders in Ihrem Unternehmen verwendet wird, und Sie den Code an ein anderes Team weitergeben, und diese werden solche Dinge tun. Aber hey, das kann man auch mit der Fabrik machen und wäre mit einer dynamischen Fabrik noch besser !!
Wie auch immer, der Kommentarbereich ist offen für dich, um mich zu töten.