JavaRush /Java-Blog /Random-DE /Fabrikdesignmuster

Fabrikdesignmuster

Veröffentlicht in der Gruppe Random-DE
Hallo Freund! Heute werden wir mit Ihnen weiterhin Designmuster studieren. In diesem Vortrag werden wir über die Fabrik sprechen. Wir besprechen mit Ihnen, welches Problem mit dieser Vorlage gelöst werden kann, und schauen uns ein Beispiel an, wie eine Fabrik bei der Eröffnung eines Cafés hilft. Und ich werde Ihnen auch 5 einfache Schritte zum Erstellen einer Fabrik geben. Fabrikentwurfsmuster – 1Um mit allen auf dem gleichen Stand zu sein und das Wesentliche leicht zu verstehen, sollten Sie mit den folgenden Themen vertraut sein:
  • Vererbung in Java
  • Einschränken und Erweitern von Referenztypen in Java
  • Interaktion zwischen verschiedenen Klassen und Objekten

Was ist eine Fabrik?

Mit dem Factory-Entwurfsmuster können Sie die Erstellung von Objekten steuern. Der Prozess der Erstellung eines neuen Objekts ist nicht so einfach, aber auch nicht allzu kompliziert. Wir alle wissen, dass wir zum Erstellen eines neuen Objekts das verwenden müssen new. Und es mag den Anschein haben, als gäbe es hier nichts zu bewältigen, aber das ist nicht so. Es kann zu Schwierigkeiten kommen, wenn unsere Anwendung eine bestimmte Klasse hat, die viele Nachkommen hat, und es abhängig von bestimmten Bedingungen erforderlich ist, eine Instanz einer bestimmten Klasse zu erstellen. Factory ist ein Entwurfsmuster, das dabei hilft, das Problem der Erstellung unterschiedlicher Objekte abhängig von bestimmten Bedingungen zu lösen. Abstrakt, nicht wahr? Mehr Spezifität und Klarheit werden deutlich, wenn wir uns das folgende Beispiel ansehen.

Wir kreieren verschiedene Kaffeesorten

Nehmen wir an, wir möchten ein Café automatisieren. Wir müssen lernen, verschiedene Kaffeesorten zuzubereiten. Dazu erstellen wir in unserer Anwendung eine Kaffeeklasse und ihre Derivate: Americano, Cappuccino, Espresso, Latte – die Kaffeesorten, die wir zubereiten werden. Beginnen wir mit dem allgemeinen Kaffeekurs:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
Als nächstes erstellen wir seine Erben:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Unsere Kunden bestellen eine Kaffeesorte und diese Informationen müssen an das Programm übergeben werden. Dies kann auf unterschiedliche Weise erfolgen, beispielsweise über String. Aber für diese Zwecke ist es am besten geeignet enum. enumLassen Sie uns darin die Kaffeesorten erstellen und definieren, für die wir Bestellungen annehmen:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Großartig, jetzt schreiben wir den Code für unser Café:
public class CoffeeShop {

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }
}
Die Methode orderCoffeekann in zwei Komponenten unterteilt werden:
  1. Erstellen einer bestimmten Kaffeeinstanz in einem Block switch-case. Hier erstellt die Fabrik abhängig von den Bedingungen einen bestimmten Typ.
  2. Die Zubereitung selbst besteht aus Mahlen, Kochen und Abfüllen in eine Tasse.
Was Sie wissen sollten, wenn Sie in Zukunft Änderungen an der Methode vornehmen müssen:
  1. Der Zubereitungsalgorithmus selbst (mahlen, kochen und in eine Tasse gießen) bleibt unverändert (zumindest hoffen wir).
  2. Das Kaffeeangebot kann sich jedoch ändern. Vielleicht fangen wir an, Mokka zuzubereiten ... Mokka ... Mokkachi ... Gott segne ihn, eine neue Kaffeesorte.
Wir können bereits davon ausgehen, dass wir in Zukunft mit einer gewissen Wahrscheinlichkeit Änderungen an der Methode, am Block vornehmen müssen switch-case. Es ist auch möglich, dass die Methode nicht der einzige Ort ist, an dem wir in unserem Café orderCoffeeverschiedene Kaffeesorten herstellen. Daher müssen an mehreren Stellen Änderungen vorgenommen werden. Du verstehst wahrscheinlich schon, worauf ich hinaus will. Wir müssen umgestalten. Verschieben Sie den für die Kaffeezubereitung verantwortlichen Block aus zwei Gründen in eine separate Klasse:
  1. Wir werden die Logik der Kaffeezubereitung an anderen Orten wiederverwenden können.
  2. Wenn sich das Sortiment ändert, müssen wir den Code nicht überall dort bearbeiten, wo die Kaffeezubereitung zum Einsatz kommt. Es reicht aus, den Code nur an einer Stelle zu ändern.
Mit anderen Worten: Es ist Zeit, die Fabrik zu verkleinern.

Wir sägen unsere erste Fabrik

Dazu erstellen wir eine neue Klasse, die nur für die Erstellung der erforderlichen Instanzen von Kaffeeklassen verantwortlich ist:
public class SimpleCoffeeFactory {
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
Gratuliere dir! Wir haben gerade das Factory-Entwurfsmuster in seiner einfachsten Form implementiert. createCoffeeAllerdings könnte alles noch einfacher sein, wenn die Methode statisch gemacht würde . Aber dann würden wir zwei Möglichkeiten verlieren:
  1. Erben SimpleCoffeeFactoryund überschreiben Sie die createCoffee.
  2. Implementieren Sie die erforderliche Factory-Implementierung in unseren Kursen.
Apropos Umsetzung. Wir müssen zurück ins Café gehen und unsere Kaffeefabrik einrichten.

Einführung einer Fabrik in ein Café

Schreiben wir unsere Coffeeshop-Klasse mithilfe einer Fabrik um:
public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }
}
Großartig. Versuchen wir nun, die Struktur des Factory-Entwurfsmusters schematisch und prägnant zu beschreiben.

5 Schritte zur Eröffnung Ihrer eigenen Fabrik

Schritt 1. In Ihrem Programm haben Sie eine Klasse mit mehreren Nachkommen, wie im Bild unten: Fabrikentwurfsmuster – 2Schritt 2. Sie erstellen eine Klasse enum, in der Sie für jede Nachkommenklasse eine Enum-Variable definieren:
enum CatType {
    LION,
    TIGER,
    BARSIK
}
Schritt 3. Sie bauen Ihre Fabrik. Sie nennen es MyClassFactory, der Code ist unten:
class CatFactory {}
Schritt 4: Sie erstellen in Ihrer Factory eine Methode createMyClass, die die Variable - akzeptiert enum MyClassType. Code unten:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
Schritt 5. Sie schreiben einen Block in den Hauptteil der Methode, switch-casein dem Sie alle Enum-Werte durchlaufen und eine Instanz der Klasse erstellen, die enumdem Wert entspricht:
class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;

            switch (type) {
                case LION:
                    cat =  new Barsik();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case BARSIK:
                    cat =  new Lion();
                    break;
            }

            return cat;
        }
    }
Wie ein Chef.

Wie man trainiert

Lesen ist gut, Code schreiben ist noch besser. Wenn Ihr Name eine gerade Anzahl von Buchstaben hat, versuchen Sie, Ihre eigene virtuelle Pizzeria zu gründen. Wenn Ihr Name eine ungerade Anzahl an Buchstaben hat, versuchen Sie, eine virtuelle Sushi-Bar zu erstellen. Wenn Sie anonym sind, haben Sie Glück. Heute können Sie sich ausruhen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION