[GO] Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster

GoF-Entwurfsmuster sind auch in den Java-Bibliotheken versteckt, die Sie am häufigsten verwenden. Es ist leicht, die geschäftige tägliche Arbeit zu übersehen, aber schauen wir uns ab und zu das schöne Design genauer an, das als eine Art Kunst bezeichnet werden kann.

Diese Kunst

Quelldatei

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
...
    ...
    //Generieren Sie ein neues XML-Dokument im Speicher
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.newDocument();

    //Generieren Sie XML-Elemente
    Element element = document.createElement("element");
    Text text = document.createTextNode("text");
    Attr attribute = document.createAttribute("attribute");
    ...

Es ist eine Szene, in der XML-Dokumente und -Elemente in Java generiert werden, aber wenn ich sie erneut betrachte, befinde ich mich in einer tiefgreifenden und mysteriösen Oberfläche.

Anerkennungspunkte

Anstatt direkt neu zu sein, um eine "Document" -Instanz von XML zu erstellen, gehen wir die Klassen "DocumentBuilderFactory" und "DocumentBuilder" durch. Es ist eine Schnittstelle von 3 aufeinanderfolgenden "newXXX", die an den Jetstream-Angriff von Dom (Angriff eines Trios von Dom-Piloten) [^ 1] erinnert, der Gundam mit Mobile Suit Gundam heimgesucht hat, aber ehrlich gesagt ist die Redundanz spürbar. Es sieht nicht sehr schön aus. Wenn Sie jedoch den versteckten Quellcode lesen, spüren Sie möglicherweise etwas. Lassen Sie uns gemeinsam die Gedanken des Designers erkunden.

Ohne das abstrakte Fabrikmuster

Beginnen wir mit der Generierung von XML-Dokumenten und -Elementen mit dem intuitivsten Code. Beachten Sie, dass der Quellcode für diesen Abschnitt zu Illustrationszwecken fiktive Klassen enthält.

Fabrikmuster


//Dokument entspricht der Factory-Klasse des Elements
Document document = new Document();

//Generieren Sie XML-Elemente
XMLElement element = document.createXMLElement("element");
XMLText text = document.createXMLTextNode("text");
XMLAttr attribute = document.createXMLAttribute("attribute");
...

Nur für diesen Zweck gibt es kein besonderes Problem. Lassen Sie uns nun ermöglichen, zusätzlich zu XML-Elementen SOAP [^ 2] -Elemente zu generieren.

Fortsetzung des Fabrikmusters


//SOAP-Element erstellen
SOAPElement element = document.createSOAPElement("element");
SOAPText text = document.createSOAPTextNode("text");
SOAPAttr attribute = document.createSOAPAttribute("attribute");
...

Dann wird es weitere "createXXX ..." - Variationen geben, wie zum Beispiel "createSOAP ...". Es ist nicht schön, einer vorhandenen Klasse ("Dokument") viele "createXXX ..." - Methoden hinzufügen zu müssen, indem nur ein weiterer Dokumenttyp wie XML / SOAP hinzugefügt wird.

Bei Verwendung des Abstract Factory-Musters

Wenden wir nun das Abstract Factory-Muster an. Das erste ist die Generierung von XML-Dokumenten.

AbstractFactory Muster (Fabrik)


//Beim Generieren eines XML-Dokuments (Dokument entspricht der Factory-Klasse)
Document document = new XMLDocument(); //Dokumentunterklasse

Das SOAP-Dokument wird wie folgt generiert.

AbstractFactory Muster (Fabrik)


//Beim Generieren eines SOAP-Dokuments (Dokument entspricht der Factory-Klasse)
Document document = new SOAPDocument(); //Dokumentunterklasse

In beiden Fällen wird das Element wie folgt generiert.

AbstractFactory-Muster (Dinge, die von Factory generiert wurden)


//Element generieren
Element element = document.createElement("element");
Text text = document.createTextNode("text");
Attr attribute = document.createAttribute("attribute");

Erben Sie die Klasse "Document", die der abstrahierten Factory entspricht, und erstellen Sie die Klassen "XMLDocument" und "SOAPDocument", die der konkreten Factory entsprechen. (Diese Klasse ist fiktiv.) Selbst wenn Sie die Dokumenttypen wie XML / SOAP erhöhen, müssen Sie die Methode "createXXX ..." nicht mehr hinzufügen. Gleichzeitig werden die von Factory generierten Elemente ("Element", "Text", "Attr" usw.) auch abstrahiert, sodass sie unabhängig von der Art des Elements wie "XMLElement" / "SOAPElement" auf dieselbe Weise behandelt werden können. Ich werde. Es ist einfach und schön.

Die GoF-Definition des Abstract Factory-Musters lautet "bietet eine Schnittstelle, die eine Familie verwandter oder abhängiger Objekte erstellt, ohne deren konkrete Klasse anzugeben [^ 3]". Die "Familie verwandter oder abhängiger Objekte" entspricht hier "Element", "Text" und "Attr". Außerdem entspricht "eine Schnittstelle, die ohne Angabe ihrer konkreten Klasse generiert wurde" "Dokument".

Ist das Abstract Factory-Muster schwierig?

Das Abstarct Factory-Muster ist wie oben erwähnt sehr einfach, wird jedoch häufig als "schwierig" angesehen. Als ich in meinem ersten und zweiten Jahr als Ingenieur war, war ich mir nicht ganz sicher. (Okay, dass [Hiroshi Yuki](https://www.amazon.co.jp/%E7%B5%90%E5%9F%8E-%E6%B5%A9/e/B003UW60OA/ref=pd_sim_14_bl_1? _encoding = UTF8 & refRID = YDTDY91X8NYH1QKXNTMF) ist das Muster, das ich als das schwierigste empfand.) Der Grund, warum ich es schwierig finde, ist, dass es viele Klassen gibt, aber darüber hinaus ** ist es schwer zu verstehen, worüber ich mich freue * * Ich denke es ist da.

Um ehrlich zu sein, sind Sie im obigen Beispiel WEB, das eine Einführung in Entwurfsmuster darstellt, und im Beispiel von Büchern, selbst wenn Sie das Abstract Factory-Muster verwenden, nicht so glücklich. Da ist gar nichts. In diesen Fällen wird das Programm vereinfacht, um die Essenz des Musters leichter verständlich zu machen. Die tatsächlichen Vorteile des Abstract Factory-Musters liegen jedoch darin, dass das Programm etwas komplex ist.

Szenen, die vom Abstract Factory-Muster profitieren können

Zusammenfassend denke ich, dass die beste Szene, um vom Abstract Factory-Muster zu profitieren, darin besteht, die Generation der abstrahierten Factory-Klasse auszublenden.

Die Figur ist wie folgt. "Minimale Nutzung" und "Wie Sie Ihr wahres Potenzial zeigen".

AbstractFactory (Mindestnutzung)


|Anrufer|
↓    ↓
↓ Verwenden Sie ↓ Wählen Sie Factory zum Generieren
↓    ↓
↓  |Eine abstrahierte Fabrik|
↓  |Spezifische Fabrik zum Erben|
↓    ↓
↓ ↓ Generieren
↓    ↓
|Dinge gemacht mit Fabrik|

AbstractFactory (Wie man es benutzt)


|Anrufer|
↓    ↓
↓ Verwenden ↓ Verwenden
↓    ↓
↓  |Abstrahierte Fabrik|
↓    ↓
↓ ↓ Wählen Sie Factory zum Generieren
↓    ↓
↓  |Spezifische Fabrik|
↓    ↓
↓ ↓ Generieren
↓    ↓
|Dinge gemacht mit Fabrik|

Im Teil "Factory auswählen und generieren" gibt es einen Unterschied zwischen "Mindestverwendung" und "Wie man den wahren Charakter demonstriert". Der Aufrufer bestimmt mindestens die Implementierungsklasse der abstrahierten Factory. In der realen Welt verwendet die abstrahierte Factory-Klasse das dynamische Laden von Klassen [^ 4] und die Konfigurationsdatei, um die Factory-Implementierungsklasse zu bestimmen. Daher kann der Aufrufer die konkrete Factory-Implementierungsklasse ersetzen, ohne den Quellcode zu ändern.

Schauen wir uns nun noch einmal den Code am Anfang der Seite an.

//Generieren Sie ein Dokument, das der Element Factory-Klasse entspricht
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();

//Element generieren
Element element = document.createElement("element");
Text text = document.createTextNode("text");
Attr attribute = document.createAttribute("attribute");

DocumentBuilderFactory entspricht der" Abstract Factory "des Abstract Factory-Musters. Die Methode "newInstance" erstellt eine "konkrete Fabrik", die eine Unterklasse dieser "DocumentBuilderFactory" ist. Sie können die spezifische Factory-Implementierungsklasse von den folgenden Anbietern auswählen.

Liste der spezifischen Factory-Implementierungsklassen

Diese Implementierungsklassen werden automatisch in der newInstance -Methode von DocumentBuilderFactory in der folgenden Reihenfolge gefunden:

Daher erfordert ** das Ändern der Implementierungsklasse keine Änderungen am aufrufenden Code **. Ich kann nicht anders, als mich in diesem Mechanismus künstlerisch zu fühlen.

Außerdem sind am Anfang zwei Abstract Factory-Muster im Code versteckt [^ 5]. Jeder hat die folgende Konfiguration. (Für das Wort Factory wird das von Factory hergestellte Produkt als Produkt ausgedrückt.)

Die erste abstrakte Fabrik
Abstracted Factory
DocumentBuilderFactory-Klasse
Concrete Factory
Klassen in der obigen Liste ("Liste der Implementierungsklassen für Concrete Factory")
Abstrahiertes Produkt
DocumentBuilder-Klasse
Spezifisches Produkt
DocumentBuilder-Implementierungsklasse, die von den oben aufgeführten Klassen generiert wird
Zweite abstrakte Fabrik
Abstracted Factory
Dokument
Concrete Factory
Von der Klasse in der obigen Liste generierte Dokumentklasse ("Liste der Implementierungsklassen für Concrete Factory")
Abstrahiertes Produkt
Element, Text, Attr-Klasse
Spezifisches Produkt
Element-, Text- und Attr-Implementierungsklassen, die von den Klassen in der obigen Liste generiert wurden

Expertenmeinungen zum Abstract Factory-Muster

Viele Experten haben auch das Abstract Factory-Muster kommentiert.

Alan Sharoway, James R. Trot

Wenn Sie beispielsweise eine Benutzeroberfläche für ein System entwickeln, das auf mehreren Plattformen ausgeführt wird, verwenden Sie eine Gruppe von Schnittstellenobjekten, die für jedes von Ihnen verwendete Betriebssystem vorbereitet wurden. Auf diese Weise können Sie das Abstract Factory-Muster verwenden, um je nach Situation unterschiedliche Objekte zu verwenden.

["Objektorientierter Geist"](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82 % AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AE% E3% 81% 93% E3% 81% 93% E3% 82% 8D-SOFTWARE-MUSTER-% E3% 82% A2% E3% 83% A9% E3% 83% B3-% E3% 82% B7% E3% 83% A3% E3% 83% AD% E3% 82% A6% E3% 82% A7% E3 Von% 82% A4 / dp / 4621066048 /)

Jiggs Co., Ltd.

Es gibt ein "Factory Method" -Muster, das sehr ähnlich ist, aber das "Factory Method" -Muster ist ein Muster, das sich auf die Abstraktion der "Objekterzeugung" konzentriert, während das "Abstract Factory" -Muster "verwandt" ist. Es steht in der Abstraktion von "Prozeduren zum gemeinsamen Erzeugen einer Gruppe von zu verwendenden Objekten".

Aus IT Senka-Einführung in Entwurfsmuster> Abstrakte Fabrikmuster

Schließlich

Es ist eine Freude für Programmierer, intellektuellen Genuss zu genießen, indem sie nur ein paar Codezeilen betrachten, ohne ins Museum gehen zu müssen.

Wenn Sie ein Ingenieur sind, der mit der Kunst des Abstract Factory-Musters sympathisiert, wenden Sie sich bitte an den Einstellungsmanager unseres Unternehmens (Qualysite Technologies Co., Ltd.). Bitte kontaktiere mich!

In Verbindung stehender Artikel

Erstellen Sie eine Instanz

Vereinfachen Sie die Schnittstelle

Überlasse es einer anderen Klasse

Referenz-URL

[^ 1]: [Black Triple Star-Wikipedia](https://ja.wikipedia.org/wiki/Black Triple Star) [^ 2]: Protokoll zur Kommunikation mit XML. Wird auf HTTP verwendet. [^ 3]: ["Entwurfsmuster für die Wiederverwendung in der Objektorientierung"](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8 % E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3 % 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83 % 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3-% E3% 82% AC% E3% 83% B3% E3% 83% 9E-% E3% 82% A8% E3% 83% AA% E3% 83% 83% E3% 82% AF / dp / 479731126 / ref = sr_1_1? = 1495503419 & sr = 8-1 & keywords =% E3% 82% AA% E3% 83% 96% E3% 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% Von 91% E3% 82% BF% E3% 83% BC% E3% 83% B3) [^ 4]: Ich habe es in Klammern geschrieben, aber es ist nur der Java-Standard ClassLoader Ist eine Methode zum Erstellen einer Instanz aus einem Paketnamen und einem Klassennamen, die im Quellcode als Zeichenfolgen fest codiert sind. [^ 5]: Genau genommen ist die erste abstrakte Fabrik nicht das in GoF definierte abstrakte Fabrikmuster, da es nur einen Typ von abstrahiertem Produkt gibt, "DocumentBuilder".

Recommended Posts

Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
Docker. Setzen Sie häufig verwendete Befehle auf den Alias "mit Erklärung".
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden
[Viererbande] Designmusterlernen - Abstract Factory
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Docker. Setzen Sie häufig verwendete Befehle auf den Alias "mit Erklärung".
Entwurfsmuster #Factory-Methode
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Lassen Sie uns mit TDD ~ Design pattern ~ etwas entwickeln, das dem Integrierten nahe kommt
Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden