Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fabrikmuster

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 ab und zu genießen wir das schöne Design, das man als eine Art Kunst bezeichnen kann.

Diese Kunst

import java.net.URL;
import java.net.URLConnection;
...

URL url = new URL("http:Zeichenkette beginnend mit");
URLConnection connection = url.openConnection();

Es ist eine Szene, die ein Objekt erstellt, das eine Verbindung zu der durch das Argument angegebenen URL herstellt. Wenn ich es mir jedoch erneut ansehe, fasziniert mich die mysteriöse Benutzeroberfläche.

Anerkennungspunkte

URLConnection Verwenden Sie zum Erstellen einer Instanz "new URLConnection (url);" Stattdessen wird die Klasse URL durchlaufen. Ich finde jedoch immer noch die Schönheit der Einfachheit, die den Programmierer nicht unwohl fühlen lässt. Lassen Sie uns die Gedanken des Designers untersuchen.

Wenn Sie das Factory-Muster nicht verwenden

Lassen Sie uns zunächst ein Objekt erstellen, um mit dem intuitivsten Code eine Verbindung zu HTTP herzustellen.

//Hinweis:Sie können es nicht so schreiben, da der Konstruktor geschützt ist
URLConnection connection = new HttpURLConnection(url);

Wenn Sie nur HTTP als Verbindungsmethode annehmen, sollte diese Methode in Ordnung sein. Wenn es jedoch in Zukunft erforderlich wird, eine Verbindung mit einem anderen XXX-Protokoll als HTTP herzustellen, muss ** entweder unter Berücksichtigung von "HttpURLConnection" oder "XXXURLConnection" geschrieben werden.

URLConnection connection = new HttpURLConnection(url);

Und,

URLConnection connection = new XXXURLConnection(url);

In verschiedenen Teilen des Projekts werden mehrere Arten von Instanziierungscode geschrieben.

Wenn Sie sich entscheiden, die von Ihnen verwendeten Klassen von "HttpURLConnection" bis "XXXURLConnection" zu vereinheitlichen, müssen Sie ** den gesamten anwendbaren Code ** korrigieren **. Das ist nicht schön.

Tatsächlich gibt es auch eine Unterklasse von "URLConnection" namens "JarURLConnection". (Diese Klasse erwartet den Zugriff auf eine lokale JAR-Datei [^ 1].)

Bei Verwendung des Factory-Musters

Der Code am Anfang verwendet das Factory-Muster.

Wenn Sie den Konstruktor von "URL" auf eine Zeichenfolge setzen, die mit http: beginnt, gibt "url.openConnection ();" eine Instanz der Klasse "HttpURLConnection" zurück.

URL url = new URL("http:Zeichenkette beginnend mit"); //Fabrikklasse
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); //Kann in HttpURLConnection umgewandelt werden

Wenn Sie eine Zeichenfolge festlegen, die mit jar: beginnt, wird eine Instanz der Klasse "JarURLConnection" zurückgegeben.

URL url = new URL("jar:Zeichenkette beginnend mit"); //Fabrikklasse
JarURLConnection connection = (JarURLConnection)url.openConnection(); //Kann in JarURLConnection umgewandelt werden

Mit dem Factory-Muster können Sie ** die Factory-Klasse entscheiden lassen, welche Klasse instanziiert werden soll. Außerdem ist der Code, der eine neue Instanz erstellt, ausgeblendet **, sodass Sie die interne Implementierung ändern können, während Sie dieselbe Schnittstelle beibehalten. Wie elegant!

Expertenmeinungen zum Factory-Muster

Viele Experten haben auch das Factory-Muster kommentiert.

Yoshihara Hidehiko

Der Benutzer des Objekts fordert die Fabrik einfach auf, es zu erstellen. Er muss nicht über die Prozedur oder die Art der Objekterstellung informiert sein und kann das gewünschte Objekt in einen verwendbaren Zustand versetzen. Wenn der Typ der zu generierenden Klasse oder der Erstellungsvorgang geändert wird, müssen Sie lediglich die Factory ändern.

Aus Umgekehrtes Entwurfsmuster, das selbst Affen verstehen können

Alan Shalloway / James R. Trott

Bei der Erstellung und Verwaltung von Objekten sind allgemeine Regeln zu beachten. Es heißt: "Ein Objekt kann nur andere Objekte erstellen und / oder verwalten oder andere Objekte verwenden und nicht beide."

["Objektorientierter Geist zum Lernen mit Entwurfsmustern"](https://www.amazon.co.jp/%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% 81% A8% E3% 81% A8% E3% 82% 82% E3% 81% AB% E5 % AD% A6% E3% 81% B6% 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% Von E3% 83% B3-% E3% 82% B7% E3% 83% A3% E3% 83% AD% E3% 82% A6% E3% 82% A7% E3% 82% A4 / dp / 4894716844 /)

Unterschied zum Muster der GoF Factory-Methode

Das GoF-Entwurfsmuster führt das Factory-Methodenmuster anstelle des Factory-Musters ein. Im Factory-Methodenmuster wird die Factory-Klasse (in diesem Fall URL-Klasse) zu einer abstrakten Klasse, und ihre konkrete Klasse XXXFactory-Klasse (in diesem Fall HttpURL / JarURL-Klasse [^ 2]) entspricht der entsprechenden Instanz (in diesem Fall). Erstellt HttpURLConnection / JarURLConnection).

Wenn die Wahrscheinlichkeit groß ist, dass die Anzahl der abgeleiteten Klassen von "URLConnection" wie "XXXURLConnection" in Zukunft zunimmt, ist es meiner Meinung nach besser, "URL" zu einer abstrakten Klasse zu machen, damit eine Factory-Klasse wie "XXXURL" erstellt werden kann. Ich werde. Der Designer hielt dies jedoch wahrscheinlich für unwahrscheinlich. Das aktuelle Design ist für Benutzer einfacher und benutzerfreundlicher.

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 Fabrikmusters sympathisiert, wenden Sie sich bitte an unsere Rekrutierungsmitarbeiter (Qualysite Technologies Co., Ltd.)!

In Verbindung stehender Artikel

Erstellen Sie eine Instanz

Vereinfachen Sie die Schnittstelle

Überlasse es einer anderen Klasse

Referenz-URL

[^ 1]: In der Referenz-URL finden Sie ein Beispiel für die Verwendung der JarURLConnection-Klasse. [^ 2]: Es existiert nicht wirklich.

Recommended Posts

Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fabrikmuster
Überdenken von Entwurfsmustern mit Java8-Lambda-Ausdrücken und Stream - Builder-Muster -
Einführung in Design Patterns (Abstract Factory)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Java-Entwurfsmuster
Java-Entwurfsmuster
Entwurfsmuster ~ Abstrakte Fabrik ~
Häufig verwendete Java-Generika
Einführung in Entwurfsmuster (Einführung)
Ich habe nc (netcat) normalerweise mit JAVA gemacht
Zusammenfassung des Java-Entwurfsmusters
[Java] Ändern Sie die Verarbeitung entsprechend der Situation mit dem Strategiemuster
[Persönliches Memo] Häufig verwendete Java-Grammatik, die von Zeit zu Zeit aktualisiert wird
Einführung in Entwurfsmuster (Builder)
Java zum Spielen mit Function
Einführung in Entwurfsmuster (Composite)
[Entwurfsmuster] Java-Kernbibliothek
Einführung in Designmuster (Fliegengewicht)
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Einführung in Entwurfsmuster Prototyp
Einführung in Entwurfsmuster (Iterator)
[Java] Zusammenfassung der Entwurfsmuster
Einführung in Entwurfsmuster (Strategie)
Entwerfen Sie ein Muster, um es mit dem Swift-Iterator-Muster zu versuchen, das Array und Dictionary unterstützt
Ruby mit AtCoder lernen 11 So erhalten Sie häufig verwendete Standardeingaben
[Java] Mit Arrays.asList () zu beachtende Punkte
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Ich habe versucht, mit Java zu interagieren
Java, Arrays für Anfänger
Wichtiges Entwurfsmuster zur Verbesserung der Wartbarkeit