Abstraktes Fabrikmuster in Java

1. Übersicht

In diesem Artikel werden wir das Entwurfsmuster von Abstract Factory diskutieren.

Das Buch Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software besagt, dass eine abstrakte Fabrik „eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte ohne Angabe ihrer konkreten Klassen bietet“. Mit anderen Worten, dieses Modell ermöglicht es uns, Objekte zu erstellen, die einem allgemeinen Muster folgen.

Ein Beispiel für das Entwurfsmuster von Abstract Factory im JDK ist newInstance () der Klasse javax.xml.parsers.DocumentBuilderFactory .

2. Beispiel für ein abstraktes Fabrikentwurfsmuster

In diesem Beispiel erstellen wir zwei Implementierungen des Factory Method Design-Musters: AnimalFactory und Color Factory.

Danach verwalten wir den Zugriff auf sie mithilfe einer Abstract Factory AbstractFactory:

Zuerst erstellen wir eine Familie von Tierklassen und werden sie später in unserer Abstract Factory verwenden.

Hier ist die Animal- Oberfläche:

public interface Animal { String getAnimal(); String makeSound(); }

und eine konkrete Umsetzung Duck :

public class Duck implements Animal { @Override public String getAnimal() { return "Duck"; } @Override public String makeSound() { return "Squeks"; } } 

Darüber hinaus können wir genau auf diese Weise konkretere Implementierungen der Tierschnittstelle (wie Hund, Bär usw.) erstellen .

Die Abstract Factory befasst sich mit Familien abhängiger Objekte. Vor diesem Hintergrund werden wir noch eine Familie vorstellen Farbe als Schnittstelle mit einigen Implementierungen ( Weiß, Braun, ... ).

Wir werden den eigentlichen Code vorerst überspringen, aber er kann hier gefunden werden.

Nachdem wir mehrere Familien bereit haben, können wir eine AbstractFactory- Schnittstelle für sie erstellen :

public interface AbstractFactory { T create(String animalType) ; }

Als Nächstes implementieren wir eine AnimalFactory mit dem im vorherigen Abschnitt beschriebenen Entwurfsmuster der Factory-Methode:

public class AnimalFactory implements AbstractFactory { @Override public Animal create(String animalType) { if ("Dog".equalsIgnoreCase(animalType)) { return new Dog(); } else if ("Duck".equalsIgnoreCase(animalType)) { return new Duck(); } return null; } } 

In ähnlicher Weise können wir eine Factory für die Farbschnittstelle mit demselben Entwurfsmuster implementieren .

Wenn alles eingestellt ist, werden wir eine schaffen FactoryProvider Klasse , die uns mit einer Implementierung liefert AnimalFactory oder ColorFactory je nach dem Argument , dass wir auf die Lieferung GetFactory () Methode:

public class FactoryProvider { public static AbstractFactory getFactory(String choice){ if("Animal".equalsIgnoreCase(choice)){ return new AnimalFactory(); } else if("Color".equalsIgnoreCase(choice)){ return new ColorFactory(); } return null; } }

3. Wann wird das abstrakte Factory-Muster verwendet?

  • Der Client ist unabhängig davon, wie wir die Objekte im System erstellen und zusammenstellen
  • Das System besteht aus mehreren Objektfamilien, und diese Familien können zusammen verwendet werden
  • Wir benötigen einen Laufzeitwert, um eine bestimmte Abhängigkeit zu erstellen

Während das Muster beim Erstellen vordefinierter Objekte großartig ist, kann das Hinzufügen der neuen Objekte eine Herausforderung sein . Um den neuen Objekttyp zu unterstützen, müssen die AbstractFactory- Klasse und alle ihre Unterklassen geändert werden.

4. Zusammenfassung

In diesem Artikel haben wir das Entwurfsmuster von Abstract Factory kennengelernt.

Schließlich finden Sie die Implementierung dieser Beispiele wie immer auf GitHub.