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.
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.
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.
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].)
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!
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 /)
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.
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.)!
[^ 1]: In der Referenz-URL finden Sie ein Beispiel für die Verwendung der JarURLConnection-Klasse. [^ 2]: Es existiert nicht wirklich.
Recommended Posts