Wann verwenden Sie das abstrakte-Fabrik-Muster?
Ich versuche kurz und bündig zu beschreiben wenn zu verwenden, eine Fabrik, für mich und mein team. Ich lief über die folgenden Fragen, die etwas geholfen:
- Wann das factory Pattern?
- (nützliche pdf-link ist kaputt)
- Wie erstellen Sie Ihre Fabriken?
- (mehr 'wie' statt 'als')
- Was ist Ihre Schwelle Fabrik statt einem Konstruktor, um ein Objekt zu erstellen?
- (einige Allgemeine Antworten)
- Fabrik-Muster. Wann verwendet factory-Methoden?
- (mehr über factory-Methoden als factory-Klassen)
- Wann Fabrikmethode-Muster?
- (wieder mehr über factory-Methoden)
Basierend auf diesen links, und eine Reihe von anderen Quellen (aufgeführt am Ende), habe ich die folgenden:
, Wenn die abstrakte-Fabrik-Muster:
- wenn Sie über eine Schnittstelle, var oder die 'new' - operator
- z.B. User User = new ConcreteUserImpl();
- und den code, den Sie schreiben sollten testbar sein /extensible irgendwann
Erklärung:
- Schnittstellen von Natur implizieren mehrere Implementierungen (gut für unit-Tests)
- Schnittstelle vars bedeuten, OCP - und LSP-kompatiblen code (support sub-classing)
- dem 'new' - operator bricht OCP/DI, da stark gekoppelten Klassen sind schwierig zu testen oder zu ändern
"Erstelle ich eine Fabrik für jeden Objekt-Typ? Das scheint übertrieben."
- Nein, Sie können eine (oder ein paar) Fabriken, die produzieren eine Menge von (meist Verwandte) Objekt-Typen
- z.B. Studio.createUser(); Studio.createCatalog(); usw.
NICHT zu verwenden wenn eine Fabrik:
- das neue Objekt ist sehr einfach und kaum zu sub-klassifiziert
- z.B. Liste list = new ArrayList();
- das neue Objekt ist nicht interessant zu testen
- hat keine Abhängigkeiten
- führt keine relevanten oder lange andauernde Arbeit
- z.B. Logger log = new SimpleLogger();
Referenzen:
- http://googletesting.blogspot.com/2008/08/where-have-all-singletons-gone.html
- http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/
- http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
- http://en.wikipedia.org/wiki/Dependency_Injection
- http://en.wikipedia.org/wiki/Open_Closed_Principle
- http://en.wikipedia.org/wiki/Liskov_substitution_principle
Meine Frage ist: ist meine Zusammenfassung genau, und macht es Sinn? Gibt es irgendetwas, was ich übersehen habe?
Vielen Dank im Voraus.
- Ich hasse die Wiederbelebung Alter threads, aber... ich bin nicht einverstanden, dass der Logger sollte neu sein würde, wie oben beschrieben. Ich habe oft mit verschiedenen Datenloggern in unterschiedlichen Testumgebungen. Ich konfigurieren Sie die Umgebung zur Verwendung einer bestimmten logger und injizieren es in Objekte, die log. (Ich könnte sogar Spritzen arrays Logger.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde auch sagen, dass Sie nicht verwenden, wenn eine Fabrik, Sie haben eine spezielle Implementierung, die Sie wollen. Um weiterhin die
List
Beispiel, ich weiß, dass ich möchte, dass einArrayList
denn ich Tue random access. Ich will nicht zu verlassen Sie sich auf eine erste Fabrik dieses Recht, wenn ich es selbst tun.Umgekehrt, wenn ich will nicht wissen, über die konkrete Unterklasse, dann kann ich mit einem factory und lassen Sie es kümmern, welches Objekt wirklich instanziiert werden.
Ich denke, ich würde vorschlagen, dass Sie fügen Sie eine Kugel auf das "Wann verwenden Sie das abstrakte-Fabrik-Muster", die sagt, "und Sie nicht wirklich interessieren, welche konkrete Unterklasse, die Sie bekommen", und das Gegenteil zu "nicht zu verwenden wenn eine Fabrik".
EDIT: Seien Sie vorsichtig, um zu vermeiden, die general-purpose-tool-Gebäude Fabrik Fabrik Fabrik.
ArrayList
undLinkedList
ist eines der wenigen Male, dass Sie nicht egal, weil Sie haben unterschiedliche Leistungsmerkmale. Du hast Recht: für die Prüfung ist es am besten zu ignorieren, die tatsächliche Umsetzung so viel wie möglich.In der Regel verwenden Sie es, wenn Sie wollen, können die Schalter der Umsetzung durch externe Konfiguration.
JAXP JDBC und sind dafür hervorragende Beispiele. Weitere Beispiele, schauen Sie diese Antwort.
Abstrakte Fabrik-Muster stellt eine Möglichkeit zur Kapselung von Betonwerken, dass teilen einige Gemeinsamkeiten mit einander, das heißt, Sie implementieren dasselbe interface/abstrakte Klasse.
Müssen Sie die Verwendung von factory-Muster, Wann immer Sie wollen, um die Kontrolle der Initialisierung Ihrer Objekte, anstatt die Steuern auf den Verbraucher über.