Anwendbare Anlässe:
7.3 Anwendbare Anlässe des Factory-Musters
Der einfachste Weg, ein neues Objekt zu erstellen, besteht darin, das Schlüsselwort new und eine konkrete Klasse zu verwenden. Nur in bestimmten Situationen lohnt sich die zusätzliche Komplexität der Erstellung und Wartung einer Objektfabrik. In diesem Abschnitt werden diese Anlässe zusammengefasst.
7.3.1 Dynamische Implementierung
Wenn Sie einige Objekte erstellen müssen, die dieselbe Schnittstelle auf unterschiedliche Weise implementieren, wie im vorherigen Fahrradbeispiel, können Sie eine Factory-Methode oder ein einfaches Factory-Objekt verwenden Um die Auswahl zu vereinfachen. Der Prozess der Implementierung. Diese Wahl kann explizit oder implizit getroffen werden. Ersteres ähnelt dem Fahrradbeispiel, bei dem Kunden das benötigte Fahrradmodell auswählen können, und das XHR-Fabrikbeispiel im nächsten Abschnitt gehört zu Letzterem. Der Typ des in diesem Beispiel zurückgegebenen Verbindungsobjekts hängt von der erkannten Bandbreite und Netzwerkverzögerung ab. Zeit und andere Faktoren. In solchen Situationen haben Sie es normalerweise mit einer Reihe von Klassen zu tun, die dieselbe Schnittstelle implementieren und gleich behandelt werden können. Dies ist der häufigste Grund für die Verwendung des Factory-Musters in JavaScript.
7.3.2 Einsparung von Einrichtungsaufwand
Wenn Objekte komplexe Einstellungen erfordern, die miteinander in Beziehung stehen, kann die Verwendung des Factory-Musters die für jedes Objekt erforderliche Codemenge reduzieren. Dies ist besonders nützlich, wenn diese Einrichtung nur einmal für alle Instanzen eines bestimmten Typs durchgeführt werden muss. Das Einfügen dieser Art von Setup-Code in den Konstruktor einer Klasse ist nicht effizient, da der Code auch nach Abschluss der Setup-Arbeit jedes Mal ausgeführt wird, wenn eine neue Instanz erstellt wird, und dadurch der Setup-Code auf verschiedene Klassen verteilt wird. Fabrikmethoden sind für diese Situation sehr gut geeignet. Es kann einmalig eingerichtet werden, bevor alle erforderlichen Objekte instanziiert werden. Dieser Ansatz hält den Setup-Code an einem Ort, unabhängig davon, wie viele verschiedene Klassen instanziiert werden.
Dies ist besonders nützlich, wenn die von Ihnen verwendete Klasse das Laden einer externen Bibliothek erfordert. Factory-Methoden können nach diesen Bibliotheken suchen und diejenigen, die nicht gefunden werden, dynamisch laden. Dieser Einstellungscode ist nur an einer Stelle vorhanden, sodass er später viel einfacher geändert werden kann.
7.3.3 Viele kleine Objekte verwenden, um ein großes Objekt zu bilden
Factory-Methoden können verwendet werden, um Objekte zu erstellen, die viele kleinere Objekte kapseln. Betrachten Sie den Konstrukteur eines Fahrradobjekts. Ein Fahrrad enthält viele kleinere Subsysteme: Räder, Rahmen, Getriebekomponenten, Bremsen usw. Factory-Methoden sind ideal, wenn Sie nicht möchten, dass ein Subsystem stark an ein größeres Objekt gekoppelt ist, sondern zur Laufzeit aus vielen Subsystemen auswählen möchten. Mit dieser Technologie könnten Sie an einem Tag alle Fahrräder, die Sie verkaufen, mit einer bestimmten Kette ausrüsten, und wenn Sie am nächsten Tag eine andere Kette finden, die Ihnen besser gefällt, können Sie auf diese neue Variante umsteigen. Die Umsetzung dieser Änderung ist einfach, da die Konstrukteure dieser Fahrradklassen nicht auf eine bestimmte Kettenart angewiesen sind. Das RSS-Reader-Beispiel weiter unten in diesem Kapitel demonstriert die Verwendung des Factory-Musters in diesem Zusammenhang.
Das Factory-Muster stellt hauptsächlich eine Schnittstelle zum Erstellen von Objekten bereit. Das Fabrikmuster ist gemäß der Formulierung in „Java und Muster“ in drei Kategorien unterteilt:
1. Einfaches Fabrikmuster (Einfache Fabrikmethode)
3 Muster (Abstrakte Fabrik)
Diese drei Modi werden schrittweise von oben nach unten abstrahiert und sind allgemeiner. Es gibt eine andere Klassifizierungsmethode, bei der das einfache Fabrikmuster als Sonderfall des Fabrikmethodenmusters betrachtet und in eine Kategorie eingeteilt wird. Bei der Verwendung des Factory-Musters gibt es zwei Situationen:
1. Es ist unmöglich vorherzusagen, welche Klasseninstanz beim Codieren erstellt werden muss.
2. Das System sollte sich nicht auf die Details verlassen, wie Produktklasseninstanzen erstellt, kombiniert und ausgedrückt werden
3. Wie der Name schon sagt, ist dieses Muster selbst Sehr einfach und wird verwendet, wenn das Geschäft relativ einfach ist.
Es besteht aus drei Rollen (die Beziehung ist im folgenden Klassendiagramm dargestellt):
1. Fabrikrolle: Dies ist der Kern dieses Modells und enthält bestimmte Geschäftslogik und Beurteilungslogik. In Java wird es oft durch eine konkrete Klasse implementiert.
2. Abstrakte Produktrolle: Es handelt sich im Allgemeinen um die übergeordnete Klasse, die von einem bestimmten Produkt oder der implementierten Schnittstelle geerbt wird. Es wird in Java über eine Schnittstelle oder eine abstrakte Klasse implementiert.
3. Spezifische Produktrolle: Das von der Factory-Klasse erstellte Objekt ist eine Instanz dieser Rolle. Implementiert durch eine konkrete Klasse in Java.
Wie nutzt man also das einfache Fabrikmuster? Lassen Sie mich Ihnen ein Beispiel geben. Ich denke, das ist viel einfacher zu verstehen als eine lange theoretische Beschreibung! Behandeln wir diesen Emporkömmling: P
Nachdem er den einfachen Werksmodus verwendet hat, muss der Emporkömmling jetzt nur noch im Auto sitzen und zum Fahrer sagen: „Fahren“. Schauen wir uns an, wie es umgesetzt wird:
//Abstrakte Produktrolle
public interface Car{
public void drive();
}
//Konkrete Produktrolle
public class Benz implementiert Car{
public void drive() {
System.out.println("Driving Benz ");
public class Bmw implementiert Car{
public void drive( ) {
System.out.println("Driving Bmw ");. . . (Ich werde nicht über Audi schreiben :P)
//Factory-Klassenrolle
public class Driver{
//Factory-Methode
//Beachten Sie, dass der Rückgabetyp eine abstrakte Produktrolle ist
public static Car driversCar(String s)throws Exception {
//Beurteilungslogik, spezifische Produktrolle an Client zurückgeben
if(s.equalsIgnoreCase("Benz")) return new Benz();
else if (s .equalsIgnoreCase("Bmw"))
return new Bmw();
...
else throw new Exception();
. . .
//Willkommen die Emporkömmlinge...
public class Magnate{
public static void main(String[] args){
try{
//Sagen Sie dem Fahrer, dass ich heute Take a Mercedes Benz
Car car = Driver.driverCar("benz">//Geben Sie den Befehl: drive
car.drive(); . .
Wenn Sie alle Klassen in einer Datei zusammenfassen, vergessen Sie bitte nicht, dass nur eine Klasse als öffentlich deklariert werden kann. Die Beziehung zwischen den Klassen im Programm ist wie folgt:
Dies ist das einfache Factory-Muster. Das Folgende sind seine Vorteile:
Erstens ist unser Programm nach der Verwendung des einfachen Fabrikmusters nicht mehr „krank“ und entspricht eher der realen Situation, und der Kunde ist von der Verantwortung für die direkte Produkterstellung befreit Objekte und ist nur für den „Verbrauch“ von Produkten verantwortlich (wie es Emporkömmlinge tun).
Lassen Sie uns das einfache Fabrikmodell anhand des Öffnungs- und Schließprinzips analysieren. Wenn der Emporkömmling ein Auto hinzufügt, kann es vom Kunden verwendet werden, solange es dem durch das abstrakte Produkt festgelegten Vertrag entspricht, sofern die Fabrikklasse benachrichtigt wird. Für den Produktteil gilt also das Open-Close-Prinzip – offen für Erweiterungen und geschlossen für Modifikationen. Der Fabrikteil scheint jedoch nicht ideal zu sein, da jedes Mal, wenn ein Auto hinzugefügt wird, die entsprechende Geschäftslogik zur Fabrikklasse hinzugefügt werden muss . und Urteilslogik, die offensichtlich gegen das Eröffnungs- und Schlussprinzip verstößt.
Eine solche Fabrikklasse (in unserem Fall der Fahrermeister) nennen wir die allmächtige Klasse oder die Gottklasse.
Das von uns angegebene Beispiel ist der einfachste Fall, aber in tatsächlichen Anwendungen handelt es sich bei dem Produkt wahrscheinlich um eine mehrstufige Baumstruktur. Da es im einfachen Fabrikmuster nur eine Fabrikklasse gibt, die diesen Produkten entspricht, kann dies unsere Klasse zerstören und unsere lieben Programmierer ermüden:(
Wie ich bereits erwähnt habe, ist das einfache Fabrikmuster anwendbar, wenn das Geschäft läuft Einfach, es ist möglicherweise nicht für komplexe Geschäftsumgebungen geeignet.
4. Schauen wir uns zuerst die Zusammensetzung der Fabrik an:
1 Kern des Factory-Methodenmusters. Es ist die Schnittstelle, die die spezifische Factory-Rolle implementieren muss, oder die übergeordnete Klasse, die durch eine abstrakte Klasse oder Schnittstelle dargestellt werden muss .
2. Spezifische Factory-Rolle: Sie enthält Code, der sich auf eine bestimmte Geschäftslogik bezieht. Sie wird von der Anwendung aufgerufen, um das entsprechende spezifische Produktobjekt zu erstellen.
3 In Java müssen im Allgemeinen abstrakte Klassen oder Schnittstellen implementiert werden. 4. Spezifische Produktrolle: Das durch die spezifische Fabrikrolle erstellte Objekt wird von bestimmten Klassen implementiert Java.
Verwenden wir ein Klassendiagramm, um die Beziehung zwischen ihnen klar darzustellen:
Verwenden wir ein vollständiges Beispiel, um die verschiedenen Rollen des Fabrikmusters zu betrachten Besitzt immer mehr Autos. Er muss sich alle Autos merken und sie nutzen. Also hat der Emporkömmling so viele Jahre lang Mitleid mit ihm gehabt. Sie müssen in Zukunft nicht mehr so hart arbeiten, und Sie müssen sich nur um sie kümmern. Der Code ist wie folgt: 🎜>//Abstrakte Produktrolle, die spezifische Produktrolle ähnelt dem einfachen Fabrikmuster, wird jedoch komplizierter, was hier weggelassen wird 🎜>öffentliche AutofahrerAuto();
öffentliche Klasse BenzDriver implementiert Driver{
public Car driversCar(){
return new Benz();
}
}
public class BmwDriver implementiert Driver{
public Car driversCar() {
return neuer Bmw();
}
}
......//Es sollte eine entsprechende Beziehung zum spezifischen Produkt entstehen, hier ist eine kurze...
//Bitte laden Sie Herrn ein . Upstart
public class Magnate
{
public static void main(String[] args)
{
try{
Driver drivers = new BenzDriver(); = drivers.driverCar();
car.drive();
}catch(Exception e)
{ }
}
}
Die Factory-Methode verwendet eine abstrakte Factory-Rolle als Kern, anstatt im einfachen Factory-Muster eine konkrete Klasse als Kern zu verwenden. Mal sehen, was uns das Factory-Methodenmuster bringt? Verwenden Sie das Öffnungs- und Schließprinzip, um das Fabrikmethodenmuster zu analysieren. Wenn ein neues Produkt (z. B. ein Auto für den Emporkömmling) hergestellt wird, kann es von Kunden verwendet werden, sofern es gemäß dem durch die abstrakte Produktrolle und die abstrakte Fabrikrolle bereitgestellten Vertrag generiert wird, ohne dass vorhandener Code geändert werden muss. Es scheint, dass das Factory-Methodenmuster vollständig mit dem Öffnungs- und Schließprinzip übereinstimmt!
Die Verwendung des Factory-Methodenmusters reicht aus, um die meisten Geschäftsanforderungen zu erfüllen, denen wir begegnen können. Wenn es jedoch viele Produkttypen gibt, gibt es eine große Anzahl entsprechender Fabrikklassen, was nicht das sein sollte, was wir wollen. Daher schlage ich vor, in diesem Fall das einfache Fabrikmuster und das Fabrikmethodenmuster zu verwenden, um die Fabrikklassen zu reduzieren: Das heißt, für ähnliche Typen im Produktbaum (normalerweise Brüder in den Blättern des Baums) verwenden Sie das einfache Fabrikmuster zu erreichen.
Selbstverständlich erfordern besondere Situationen eine besondere Behandlung: Wenn im System unterschiedliche Produktbäume vorhanden sind und es Produktfamilien im Produktbaum gibt, kann in diesem Fall das abstrakte Fabrikmuster verwendet werden.
5. Zusammenfassung
Lassen Sie uns einen Blick auf die Inspiration werfen, die uns das einfache Factory-Muster und das Factory-Methodenmuster gegeben haben:
Wenn wir das Factory-Muster nicht zur Implementierung unseres Beispiels verwenden, wird es vielleicht der Code sein erheblich reduziert werden – implementieren Sie es einfach. Vorhandene Autos verwenden keinen Polymorphismus. Aber es ist sehr schlecht in Bezug auf Wartbarkeit und Skalierbarkeit (Sie können sich vorstellen, welche Klassen nach dem Hinzufügen eines Autos betroffen sein werden). Um die Skalierbarkeit und Wartbarkeit zu verbessern, lohnt es sich daher, mehr Code zu schreiben.
6. Abstraktes Fabrikmuster
Lassen Sie uns zunächst verstehen, was eine Produktfamilie ist: eine Familie von Produkten mit verwandten Funktionen, die sich in unterschiedlichen Produkthierarchiestrukturen befinden. Wenn Sie dieses Konzept allein durch das Lesen dieses Satzes klar verstehen können, muss ich Sie bewundern. Lassen Sie uns dies anhand eines Beispiels anschaulich veranschaulichen.
BmwCar und BenzCar im Bild sind zwei Produktbäume (Produkthierarchie); und BenzSportsCar und BmwSportsCar wie im Bild gezeigt sind eine Produktfamilie. Sie können alle der Sportwagenfamilie zugeordnet werden, sodass die Funktionen verwandt sind. Ebenso sind BMWBussinessCar und BenzSportsCar eine Produktfamilie.
Zurück zum Thema des abstrakten Produktmusters: Der Unterschied zum Fabrikmethodenmuster liegt in der Komplexität der zu erstellenden Objekte. Darüber hinaus ist das abstrakte Fabrikmuster das abstrakteste und allgemeinste der drei. Der Zweck des abstrakten Factory-Musters besteht darin, dem Client eine Schnittstelle bereitzustellen, mit der Produktobjekte in mehreren Produktfamilien erstellt werden können. Darüber hinaus müssen die folgenden Bedingungen erfüllt sein, um das abstrakte Fabrikmuster zu verwenden:
1 Es gibt mehrere Produktfamilien im System und das System kann jeweils nur eines der Produkte konsumieren, zu denen es gehört Es kann entsprechend die gleiche Produktfamilie verwendet werden.
Werfen wir einen Blick auf die verschiedenen Rollen des abstrakten Fabrikmusters (die gleichen wie die der Fabrikmethode):
Abstrakte Fabrikrolle: Dies ist der Kern des Fabrikmethodenmusters, mit dem es nichts zu tun hat die Anwendung. Es handelt sich um die Schnittstelle, die eine bestimmte Factory-Rolle implementieren muss, oder um die übergeordnete Klasse, die geerbt werden muss. In Java wird es durch abstrakte Klassen oder Schnittstellen implementiert.
Spezifische Factory-Rolle: Sie enthält Code, der sich auf eine bestimmte Geschäftslogik bezieht. Wird von einer Anwendung aufgerufen, um ein Objekt zu erstellen, das einem bestimmten Produkt entspricht. In Java wird es durch konkrete Klassen implementiert.
Abstrakte Produktrolle: Es handelt sich um die übergeordnete Klasse, die von einem bestimmten Produkt oder der implementierten Schnittstelle geerbt wird. In Java müssen im Allgemeinen abstrakte Klassen oder Schnittstellen implementiert werden.
Spezifische Produktrolle: Das von der spezifischen Factory-Rolle erstellte Objekt ist eine Instanz dieser Rolle. Es wird durch bestimmte Klassen in Java implementiert.
Nachdem Sie sich die ersten beiden Modi angesehen haben, sollten Sie eine Vorstellung von der Koordination zwischen den verschiedenen Charakteren in diesem Modus haben, daher werde ich keine spezifischen Beispiele nennen. Stellen Sie sicher, dass Sie die Bedingungen für die Verwendung des abstrakten Fabrikmusters erfüllen. Andernfalls gibt es auch bei mehreren Produktbäumen Produktfamilien, die jedoch nicht verwendet werden können