Anwendbare Anlässe:
7.3 Anwendbare Anlässe für das Fabrikmodell
Der einfachste Weg, ein neues Objekt zu erstellen, besteht darin, das neue Schlüsselwort und die konkreten Klassen zu verwenden. Nur in einigen Fällen kann die zusätzliche Komplexität der Erstellung und Aufrechterhaltung einer Objektfabrik das Geld wert sein. Dieser Abschnitt fasst diese Anlässe zusammen.
7.3.1 Dynamische Implementierung
Wenn Sie Objekte erstellen müssen, die dieselbe Schnittstelle auf unterschiedliche Weise implementieren, z. Diese Wahl kann explizit oder implizit getroffen werden. Ersteres ist wie das Fahrradbeispiel, und der Kunde kann das Fahrradmodell auswählen, das Sie benötigen. Während das im nächsten Abschnitt erwähnte XHR -Fabrikbeispiel dem letzteren gehört. Der in diesem Beispiel zurückgegebene Verbindungsobjekt hängt von der erkannten Bandbreite und der Netzwerkverzögerungsfaktoren ab. In diesen Situationen müssen Sie sich normalerweise mit einer Reihe von Klassen befassen, die dieselbe Schnittstelle implementieren und gleich behandelt werden können. Dies ist der häufigste Grund für die Verwendung von Fabrikmuster in JavaScript.
7.3.2 Einstellungseinstellungen auf dem Kopf speichern
Wenn Objekte für einander komplex und relevant sein müssen, kann die Verwendung des Fabrikmodus die für jedes Objekt erforderliche Code reduzieren. Dieser Effekt ist besonders herausragend, wenn diese Einstellung für alle Instanzen eines bestimmten Typs nur einmal durchgeführt werden muss. Das Einlegen dieses Einstellungscode in den Klassenkonstruktor ist kein effizienter Ansatz, denn selbst wenn die Einstellungsarbeit abgeschlossen ist, wird der Code immer noch jedes Mal ausgeführt, wenn eine neue Instanz erstellt wird, und dies vertreibt den Einstellcode in verschiedene Klassen. Die Fabrikmethode ist perfekt für diesen Anlass. Es kann sofort festgelegt werden, bevor alle erforderlichen Objekte instanziiert werden. Unabhängig davon, wie viele verschiedene Klassen instanziiert sind, kann diese Methode den Setup -Code an einem Ort aufbewahren.
Dies ist besonders nützlich, wenn für die verwendete Klasse die externe Bibliothek geladen werden muss. Fabrikmethoden können diese Bibliotheken überprüfen und diejenigen dynamisch laden, die nicht gefunden wurden. Diese Einstellungscodes existieren nur an einem Ort, daher ist es viel bequemer, sie später zu ändern.
7.3.3 Machen Sie ein großes Objekt mit vielen kleinen Objekten
Die Werksmethode kann verwendet werden, um Objekte zu erstellen, die viele kleinere Objekte zusammenfassen. Betrachten Sie den Konstruktor des Fahrradobjekts. Fahrräder enthalten viele kleinere Subsysteme: Räder, Frames, Getriebekomponenten und Bremsen. Wenn Sie keine starke Kopplung zwischen einem Subsystem und einem größeren Objekt möchten, aber zur Laufzeit aus vielen Subsystemen auswählen möchten, ist der Werksansatz eine ideale Wahl. Mit dieser Technologie können Sie eines Tages alle Fahrräder mit einer Art Kette anpassen. Wenn Sie am nächsten Tag eine weitere Lieblingskette finden, können Sie stattdessen diese neue Sorte verwenden. Es ist einfach, diese Änderung zu implementieren, da die Konstrukteure dieser Fahrradklassen nicht von einer bestimmten Kettensorte abhängen. Das Beispiel des RSS -Lesers später in diesem Kapitel zeigt die Verwendung des Fabrikmodells in dieser Hinsicht.
Das Werksmuster bietet hauptsächlich eine Schnittstelle zum Erstellen von Objekten. Das Fabrikmodell ist nach den Begriffen in "Java und Muster" in drei Kategorien unterteilt:
1. Einfache Fabrik
2. Fabrikmethode
3.. Zusammenfassung Fabrik
Diese drei Muster sind allmählich von oben nach unten und allgemeiner abstrahieren. Es gibt auch eine Klassifizierungsmethode, bei der das einfache Fabrikmodell als Sonderfall des Fabrikmethodemodells betrachtet wird und die beiden in dieselbe Kategorie eingeteilt werden. Hier sind zwei Situationen, in denen der Werksmodus verwendet wird:
1. Bei der Codierung können Sie nicht voraussehen, welche Art von Fällen Sie erstellen müssen.
2. Das System sollte sich nicht auf Details darüber verlassen, wie Produktklasseninstanzen erstellt, kombiniert und ausgedrückt werden
3. Einfaches Werksmodell
Wie der Name schon sagt, ist dieses Modell selbst einfach und wird in Situationen verwendet, in denen das Geschäft einfacher ist.
Es besteht aus drei Rollen (siehe das Klassendiagramm unten für die Beziehung):
1. Fabrikrolle: Dies ist der Kern dieses Modells, der bestimmte Geschäftslogik und Beurteilungslogik enthält. In Java wird es oft von einer konkreten Klasse implementiert.
2. Zusammenfassung Produktrolle: Es handelt sich im Allgemeinen um eine übergeordnete Klasse, die von einem bestimmten Produkt oder einer implementierten Schnittstelle geerbt wird. Implementiert von Schnittstellen oder abstrakten Klassen in Java.
3. Spezifische Produktrolle: Das von der Fabrikklasse erstellte Objekt ist eine Instanz dieser Rolle. Implementiert von einer konkreten Klasse in Java.
Wie benutze ich also das einfache Fabrikmodell? Lassen Sie mich Ihnen ein Beispiel geben. Ich denke, das ist viel einfacher zu verstehen als eine lange theoretische Textbeschreibung! Hier ist die Behandlung für das Nouveau Riche: P.
Nach der Verwendung des einfachen Fabrikmodells muss das Nouveau Riche jetzt nur noch im Auto sitzen und dem Fahrer sagen: "Fahren". Mal sehen, wie es implementiert wird:
// abstrakte Produktrolle Public Interface Car {public void Drive (); } // Spezifische Produktrolle öffentliche Klasse Benz implementiert CAR {public void drive () {System.out.println ("Drive Benz"); }} public class bmw implementiert car {public void drive () {System.out.println ("Fahren BMW"); }}. . . (Ich werde nicht audi schreiben: p) // Fabrikklasse Rollenrolle öffentlicher Klasse Treiber {// Factory -Methode // Beachten Sie, dass der Rückgabetyp eine abstrakte Produktrolle für öffentliche statische Autofahrzeuge (Zeichenfolge S) Ausnahme auslöst (// Richter Logik beurteilen, die spezifische Produktrolle an den Kunden zurückgeben, wenn (S.EqualSignoreCase ("Benz") zurückgeben, neue Benz () zurückgeben; sonst if (S.EqualSignoreCase ("BMW") zurückgegebene neue BMW (); ...... sonst werfen neue Ausnahmen (); . . . // Begrüßen Sie das Nouveau Riche, um zu erscheinen ... öffentliche Klasse Magnate {public static void main (String [] args) {try {// Sagen Sie dem Fahrer, dass ich ein Mercedes-Benz-Auto nehme. // den Befehl geben: Drive (); . .Wenn Sie alle Klassen in eine Datei einfügen, vergessen Sie nicht, dass nur eine Klasse öffentlich erklärt wird. Die Beziehung zwischen Klassen in einem Programm ist wie folgt:
Dies ist das einfache Fabrikmodell. Hier sind die Vorteile:
Erstens ist unser Programm nach der Verwendung des einfachen Fabrikmodells nicht "krank" und entspricht eher der Realität. und der Kunde ist von der Verantwortung für die direkte Erstellung von Produktobjekten befreit, ist jedoch nur für den "Konsum" von Produkten verantwortlich (wie der Nouveau Riche).
Lassen Sie uns das einfache Fabrikmodell aus dem Prinzip des Öffnens und Schließens analysieren. Wenn das Jugendstil Riche ein Auto hinzufügt, solange er den vom abstrakten Produkt formulierten Vertrag erfüllt, kann es vom Kunden verwendet werden, solange er der Fabrik benachrichtigt wird. Für das Produktteil entspricht es dem Prinzip der Öffnung und Schließung - Öffnung für die Erweiterung und Schließung zur Änderung; Der Fabrikteil scheint jedoch nicht ideal zu sein, da jedes Mal, wenn ein Auto hinzugefügt wird, die entsprechende Geschäftslogik und die Beurteilungslogik in die Fabrikklasse hinzugefügt werden müssen, die natürlich gegen das Prinzip des Öffnens und Schließens verstößt.
Für eine solche Fabrikklasse (in unserem Fall für den Fahrer) nennen wir es die allmächtige Klasse oder die Gottesklasse.
Das Beispiel, das wir geben, ist der einfachste Fall, und in praktischen Anwendungen ist es wahrscheinlich, dass das Produkt eine Baumstruktur mit mehreren Ebenen ist. Da es im einfachen Fabrikmodell nur eine Fabrikklasse gibt, die diesen Produkten entspricht, kann dies unsere Gottklasse ruinieren und wiederum unsere schönen Programmierer erschöpfen :(
Wie ich bereits erwähnt habe, eignet sich das einfache Fabrikmodell für Situationen, in denen das Unternehmen einfach sein wird. Es ist jedoch möglicherweise nicht sehr anpassungsfähig an komplexe Geschäftsumgebungen. Dies sollte vom Factory -Methode -Modell erfolgen! !
4. METHODE METHODE MODELLE
Werfen wir zuerst einen Blick auf seine Komposition:
1.. Abstrakte Fabrikrolle: Dies ist der Kern des Fabrikmethodemusters, es hat nichts mit der Anwendung zu tun. Es ist eine Schnittstelle, dass eine bestimmte Fabrikrolle oder eine übergeordnete Klasse geerbt werden muss. In Java wird es von abstrakten Klassen oder Schnittstellen implementiert.
2. Spezifische Fabrikrolle: Es enthält Code, der sich auf eine spezifische Geschäftslogik bezieht. Von der Anwendung aufgerufen, um das entsprechende spezifische Produktobjekt zu erstellen. In Java wird es durch konkrete Klassen implementiert.
3.. Zusammenfassung Produktrolle: Es ist die übergeordnete Klasse, die von einem bestimmten Produkt oder einer implementierten Schnittstelle geerbt wird. In Java gibt es im Allgemeinen abstrakte Klassen oder Schnittstellen, die sie implementieren.
4. Spezifische Produktrolle: Das von einer bestimmten Werksrolle erzeugte Objekt ist ein Beispiel für diese Rolle. Implementiert von Betonklassen in Java.
Verwenden Sie Klassendiagramme, um die Beziehung zwischen ihnen klar darzustellen:
Verwenden wir ein vollständiges Beispiel, um zu sehen, wie die verschiedenen Rollen im Werksmodell koordiniert werden. Apropos Nouveau Riche -Geschäft, je mehr Autos sie lieben. Dies ließ den Fahrer leiden. Er musste sich an jedes Auto erinnern und pflegen, und er musste es benutzen! Also sympathisierte das Jugendstil Riche mit ihm und sagte: Es hängt von Ihren Jahren mit mir ab, Sie müssen in Zukunft nicht so hart arbeiten. Ich werde Ihnen ein paar Mitarbeiter zuweisen, kümmern Sie sich einfach um sie! Daher entstand die Verwaltung des Fabrikmethodemodells. Der Code ist wie folgt:
// abstrakte Produktrollen, die spezifischen Produktrollen ähneln dem einfachen Fabrikmodell, sind jedoch etwas komplizierter geworden, hier ist etwas weggelassen. // Abstract Factory Rolle Public Interface Driver {public Car DriverCar (); } public class Benzdriver implementiert Treiber {public Car driverCar () {return New Benz (); }} public class bmwdriver implementiert driver {public Car driverCar () {return New BMW (); }} ...... // Es sollte eine entsprechende Beziehung zum spezifischen Produkt hier bilden, hier ... // Fragen Sie Herrn Nouveaux Public Class Magnate {public static void main (String [] args) {try {driver driver = new Benzdriver (); Auto Car = Driver.DriverCar (); Car.Drive (); } catch (Ausnahme e) {}}}Die Werksmethode verwendet eine abstrakte Fabrikrolle als Kern, anstatt konkrete Klassen als Kern in einem einfachen Fabrikmuster zu verwenden. Schauen wir uns an, was uns das Factory -Methode -Modell mitgebracht hat? Verwenden Sie das Prinzip des Öffnens und Schließens, um das Factory -Method -Modell zu analysieren. Wenn ein neues Produkt (d. H. Das Auto des Nouveau Riche) generiert wird, sofern es gemäß dem Vertrag generiert wird, der durch die abstrakte Produktrolle und die abstrakte Fabrikrolle bereitgestellt wird, kann es vom Kunden verwendet werden, ohne vorhandenen Code zu ändern. Es scheint, dass das Factory -Methode -Modell vollständig dem Prinzip des Öffnens und Schließens entspricht!
Die Verwendung des Factory -Annäherungsmodells reicht aus, um die meisten geschäftlichen Anforderungen zu bewältigen, denen wir begegnen können. Wenn es jedoch viele Arten von Produkten gibt, erscheinen eine große Anzahl entsprechender Fabrikkategorien, was nicht das sein sollte, was wir hoffen. Daher schlage ich vor, in diesem Fall ein einfaches Fabrikmuster in Kombination mit dem Factory -Methode -Muster zu verwenden, um die Fabrikklasse zu reduzieren: Das heißt, ein einfaches Fabrikmuster für ähnliche Arten auf dem Produktbaum (normalerweise diejenigen, die Brüder in den Blättern des Baumes sind).
Natürlich müssen besondere Umstände mit einer Sonderbehandlung behandelt werden: Für verschiedene Produktbäume im System und es gibt Produktfamilien auf den Produktbäumen. In diesem Fall kann das abstrakte Fabrikmodell verwendet werden.
5. Zusammenfassung
Schauen wir uns die Inspiration des einfachen Factory -Modells und des Factory -Methodemodells an:
Wenn wir kein Werksmuster verwenden, um unser Beispiel zu implementieren, ist der Code möglicherweise viel weniger - implementieren Sie einfach das vorhandene Auto, ohne Polymorphismus zu verwenden. In Bezug auf die Wartbarkeit ist die Skalierbarkeit jedoch sehr schlecht (Sie können sich die Klasse vorstellen, die Sie nach dem Hinzufügen eines Autos berühren möchten). Um die Skalierbarkeit und Wartung zu verbessern, lohnt es sich daher, mehr Code zu schreiben.
6. abstraktes Fabrikmuster
Lassen Sie uns zunächst verstehen, was eine Produktfamilie ist: eine Produktfamilie, die aus Funktionen besteht, die sich in verschiedenen Produkthierarchien und Strukturen befinden. Wenn Sie dieses Konzept klar verstehen können, indem Sie diesen Satz nur lesen, muss ich Sie bewundern. Verwenden wir ein Beispiel, um es lebendig zu veranschaulichen.
BMWCAR und Benzcar in der Abbildung sind zwei Produktbäume (Produkthierarchie); Benzsportscar und BMWSportscar, wie in der Abbildung gezeigt, sind eine Produktfamilie. Sie können alle in die Sportwagenfamilie platziert werden, sodass die Funktionen verwandt sind. In ähnlicher Weise sind BMWBussinessCar und BenzSportscar auch dieselbe Produktfamilie.
Wenn man auf das Thema abstrakter Produktmodell zurückkehrt, kann gesagt werden, dass der Unterschied zwischen ihm und dem Factory -Methodenmodell in der Komplexität der Notwendigkeit liegt, Objekte zu erstellen. Darüber hinaus ist das abstrakte Fabrikmodell das abstraktste und allgemeinste unter den drei. Der Zweck des abstrakten Fabrikmusters besteht darin, dem Kunden eine Schnittstelle zur Verfügung zu stellen, um Produktobjekte in mehreren Produktfamilien zu erstellen. Darüber hinaus müssen die folgenden Bedingungen erfüllt sein, wenn das abstrakte Fabrikmuster verwendet wird:
1. Es gibt mehrere Produktfamilien im System, und das System kann nur eines der Produkte gleichzeitig konsumieren.
2. Verwenden Sie Produkte zur gleichen Produktfamilie.
Schauen wir uns die verschiedenen Rollen des abstrakten Fabrikmusters an (genau wie die Fabrikmethode):
Zusammenfassung Fabrikrolle: Dies ist der Kern des Fabrikmethodemusters, es hat nichts mit der Anwendung zu tun. Es ist eine Schnittstelle, dass eine bestimmte Fabrikrolle oder eine übergeordnete Klasse geerbt werden muss. In Java wird es von abstrakten Klassen oder Schnittstellen implementiert.
Spezifische Fabrikrolle: Es enthält Code im Zusammenhang mit spezifischer Geschäftslogik. Von der Anwendung aufgerufen, um das entsprechende spezifische Produktobjekt zu erstellen. In Java wird es durch konkrete Klassen implementiert.
Abstrakte Produktrolle: Es ist die übergeordnete Klasse oder Implementierungsschnittstelle des spezifischen Produktvererbung. In Java gibt es im Allgemeinen abstrakte Klassen oder Schnittstellen, die sie implementieren.
Spezifische Produktrolle: Das von einer bestimmten Werksrolle erzeugte Objekt ist eine Instanz dieser Rolle. Implementiert von Betonklassen in Java.
Nachdem ich die ersten beiden Modi gelesen habe, sollte ich eine klare Vorstellung von der Koordination zwischen den verschiedenen Zeichen in diesem Modus haben, sodass ich keine spezifischen Beispiele geben werde. Es ist nur so, dass Sie darauf achten müssen, die Bedingungen für die Verwendung des abstrakten Fabrikmodells zu erfüllen. Andernfalls gibt es immer noch Produktfamilien, aber sie können nicht verwendet werden.
Der obige Artikel hat ein tiefes Verständnis der drei Fabrikmodelle von Java. Dies ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.