Abstrakte Fabrik an den Fingern

Ich war aus zwei Gründen gezwungen, diesen Artikel zu schreiben. Zuletzt habe ich mich mit dem Abstract Factory-Muster getroffen. Wie das Sprichwort sagt: "Weiß nicht, wie man es selbst macht, lehre einen Freund." Es ist bekannt, dass eine der besten Möglichkeiten, Material zu konsolidieren, darin besteht, es jemandem zu erklären, der zuvor untersucht wurde. Der zweite Grund - beim Studium dieses Musters bin ich nicht auf Material gestoßen, das für mich persönlich die Essenz der Abstrakten Fabrik klar zum Ausdruck bringen würde (zumindest bei Habré).

Also fangen wir an. Die allererste Frage, die Sie selbst beantworten müssen, indem Sie dieses Muster studieren: "Was ist eine abstrakte Fabrik?" Die einfachste und genaueste Antwort ist, dass die Abstract Factory eine "Fabrik der Fabriken" ist. Aber hier erscheint eine zweite Frage: „Warum sollte jemand überhaupt eine„ Fabrik von Fabriken “brauchen? Betrachten Sie zur Beantwortung ein Beispiel aus dem wirklichen Leben.

Angenommen, Sie übernehmen die vollständige Kontrolle über den Automarkt. Wie kann man das machen? Sie können Ihre eigene Automarke, Ihre Produktion, eine große Werbefirma usw. erstellen. Aber in diesem Fall muss man mit Giganten des Automarktes wie Toyota oder Ford kämpfen. Es ist keine Tatsache, dass Sie aus diesem Kampf als Sieger hervorgehen werden. Eine viel bessere Lösung wäre, die Fabriken all dieser Unternehmen aufzukaufen, weiterhin Autos unter ihren eigenen Marken zu produzieren und den Gewinn in die Tasche zu stecken. Wenn ich mich nicht irre, nennt man eine solche Struktur in der Wirtschaft - Halten. Diese Holding wird die Abstract Factory oder „Factory of Factories“ sein. In unserem Programm wird die abstrakte Factory (Holding) durch eine Schnittstelle oder eine abstrakte Klasse dargestellt. Die in die Holding einbezogenen Unternehmen werden durch Klassen dargestellt, die diese Schnittstelle implementieren.

public interface CarsFactory { } public class ToyotaFactory implements CarsFactory {} public class FordFactory implements CarsFactory {} 

Als nächstes versammeln Sie die Manager Ihrer Fabriken und sagen: „Von nun an werden wir in unseren Fabriken Autos mit zwei Karosserietypen herstellen - eine Limousine und ein Coupé. Zum Beispiel werden die Japaner ToyotaSedan und ToyotaCoupe machen, die Amerikaner FordSedan und FordCoupe. “ Damit die Fabriken nicht vergessen, was genau zu tun ist, und beispielsweise keine SUVs starten, werden wir die allgemeinen Zeichnungen der Limousine und des Coupés im Büro unseres Betriebs an prominenter Stelle aufhängen (in einer bestimmten Fabrik werden die Ingenieure herausfinden, wie die benötigten Autos hergestellt werden). Daher erscheinen in unserer CarsFactory-Oberfläche zwei Methoden:

 public interface CarsFactory { Sedan createSedan(); Coupe createCoupe(); } 

Dementsprechend müssen auch in den untergeordneten Klassen der CarsFactory-Schnittstelle diese Methoden implementiert werden.

 public class ToyotaFactory implements CarsFactory { @Override public Sedan createSedan() { return new ToyotaSedan(); } @Override public Coupe createCoupe() { return new ToyotaCoupe(); } } public class FordFactory implements CarsFactory { @Override public Sedan createSedan() { return new FordSedan(); } @Override public Coupe createCoupe() { return new FordCoupe(); } } 

Beachten Sie, dass der Typ des Rückgabewerts in den Methoden genau dem Typ entspricht, der den Rückgabewerten gemeinsam ist - Limousine und Coupé. Zurück zu unserer Analogie - Sie haben der Fabrik gesagt, sie soll eine Limousine bauen - Sie haben eine Limousine. Funktionen wie eine Ford-Limousine sind für Sie nicht von Interesse.

Wie Sie dem obigen Code leicht entnehmen können, sollten in unserem Programm einige Entitäten erscheinen, die bestimmte Körpertypen beschreiben - eine Limousine und ein Coupé. Diese Entitäten werden Schnittstellen sein.

 public interface Sedan {} public interface Coupe {} 

Und natürlich sollten diese Zeichnungen eine spezifische Ausführungsform in Form von Autos haben, die in einer bestimmten Fabrik hergestellt wurden.

 public class ToyotaCoupe implements Coupe { public ToyotaCoupe() { System.out.println("Create ToyotaCoupe"); } } public class ToyotaSedan implements Sedan { public ToyotaSedan() { System.out.println("Create ToyotaSedan"); } } public class FordCoupe implements Coupe { public FordCoupe () { System.out.println("Create FordCoupe"); } } public class FordSedan implements Sedan { public FordSedan() { System.out.println("Create FordSedan"); } } 

Das ist alles, unsere "Fabrik der Fabriken", die Autos jeder Marke und jedes Typs produzieren kann, ist bereit. In Zukunft könnten Sie entscheiden, dass es schön wäre, mit der Produktion von SUVs zu beginnen. Sie müssen eine weitere Schnittstelle erstellen und eine Zeichnung eines SUV im Büro der Holding aufhängen (fügen Sie die erforderliche Methode zu CarsFactory hinzu und implementieren Sie sie in Tochterfabriken). Es ist auch möglich, dass Sie sich entscheiden, ein weiteres Stück des Marktes zu erobern und beispielsweise alle Nissan-Werke zu kaufen. Dies bedeutet, dass Sie eine weitere Klasse erstellen müssen, die CarsFactory implementiert - NissanFactory, und mit der Produktion Ihrer Autos unter dieser Marke beginnen müssen (NissanCoupe, NissanSedan usw.).

Aber wie wird ein bestimmter Benutzer (Autokäufer) mit unserer Beteiligung interagieren? Der Käufer weiß im Allgemeinen nicht, dass Sie alle Automobilfabriken der Welt beschlagnahmt haben. Er kommt in das kleine bescheidene Büro der Holding und sagt: "Ich brauche ein Auto!" "Großartig!" - Wir sagen ihm: - „Sie haben an die Adresse adressiert! Eine Fabrik mit Fabriken ist das, was Sie brauchen! “

 CarsFactory factory; 

„Welche Autofirma bevorzugen Sie zu dieser Tageszeit?“, Fragen wir. Angenommen, ein Kunde möchte einen Toyota kaufen. Kein Problem!

 factory = new ToyotaFactory(); 

"Welche Art von Körper möchten Sie?" Sagen wir eine Limousine. "Gute Wahl!"

 factory.createSedan(); 

Das Auto ist fertig, du kannst gehen!

Source: https://habr.com/ru/post/de465835/


All Articles