Entwurfsmuster / Design Pattern: Die abstrakte Fabrik (Abstract Factory)

avatar

Das erste Entwurfsmuster was behandelt wird ist die Abstrakte Fabrik. Sie gehört zu den erzeugenden Muster.

Zweck

Die Abstrakte Fabrik bietet eine Schnittstelle zum Erzeugen von Familien verwandter oder voneinander abhängiger Objekte, ohne ihre konkreten Klassen zu benennen.

Anwendbarkeit

Man kann die Abstrakte Fabrik unter folgenden Bedingungen verwenden:

  • Die Anwendungssoftware soll unabhängig davon sein, wie bestimmte Objekte (Produkte) erzeugt, zusammengesetzt und präsentiert werden
  • Die Anwendungssoftware soll für eine von mehreren Familien von Produkten konfigurierbar sein.
  • Nur Produkte aus einer Familie können zusammenarbeiten.
  • Eine Bibliothek wiederverwendbarer Klassen soll nur über die Schnittstellen (Interface) verfügbar gemacht werden

1abstrakt.png
Abbildung: Ein Beispiel einer Abstrakten Fabrik

Beteiligte Klassen

  • Die Klasse AbstrakteFabrik definiert eine Schnittstelle mit Operationen zur Erzeugung abstrakter Produkte
  • Die Klassen KonkreteFabrik implementiert Methoden zur Erzeugung konkreter Produkt-Instanzen.
  • Die Klasse AbstraktesProdukt definiert eine Schnittstelle für einen Typ von Produkten.
  • Die Klasse Produkt wird von der entsprechenden konkreten Fabrik instanziiert und implementiert Methoden für die Schnittstelle des
    abstrakten Produkts.
  • Die Klasse Dienstnutzer kennt nur die Schnittstellen der Klassen AbstrakteFabrik und AbstraktesProdukt

Konsequenzen

Das Muster Abstrakte Fabrik hat folgende Vor- und Nachteile:

  • Es isoliert konkrete Klassen und hilft, die von der Anwendungssoftware instanziierbaren Klassen zu kontrollieren. Da eine Fabrik die Verantwortlichkeit und den Prozess der Erzeugung von Produktinstanzen verkapselt, isoliert sie die Anwendungssoftware von den realisierenden Klassen. Klassennamen der konkreten Produktklassen tauchen somit nicht in den Klassen der Anwendungssoftware auf.
    Diese manipuliert Produktinstanzen nur über die Schnittstelle der abstrakten Produktklassen.

  • Es vereinfacht den Austausch ganzer Produktfamilien, da die Klasse einer konkreten Fabrik nur einmal explizit angesprochen wird, nämlich am Ort ihrer Instanziierung. So kann die von der Anwendungssoftware verwendete Produktfamilie einfach durch Angabe einer anderen konkreten Fabrik geändert werden.

  • Es erzwingt die Konsistenz der von der Anwendungssoftware benutzten Produkte, wenn zu einem bestimmten Zeitpunkt nur genau eine Instanz (einer Unterklasse) der Klasse AbstrakteFabrik existieren darf. Dies ist insbesondere dann wichtig, wenn die Produkte aus unterschiedlichen Familien nicht untereinander kompatibel sind.

  • Es erschwert die Hinzunahme neuer Produkte, da jede abstrakte Fabrik eine Operation zur Erzeugung jedes Produkts einer Familie definiert. Für jedes neue Produkt muss also diese Schnittstelle und eine Implementierung in allen konkreten Unterklassen der abstrakten Fabrik sowie des abstrakten Produkts eingeführt werden.

Quelle
[1] Erich Gamma, Richard Helm, Ralph Johnson und John M. Vlissides Design Patterns — Elements of Reusable Object-Oriented Software Addison Wesley, Reading, MA, 1994



0
0
0.000
1 comments