Die abstrakte Fabrik (englisch abstract factory, kit) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung, das zur Kategorie der Erzeugungsmuster (englisch creational patterns) gehört. Es definiert eine Schnittstelle zur Erzeugung einer Familie von Objekten, wobei die konkreten Klassen der zu instanziierenden Objekte nicht näher festgelegt werden.[1] Das Muster ist eines der Entwurfsmuster, die von der sogenannten Viererbande (GoF) publiziert wurden.
Die abstrakte Fabrik wird angewendet, wenn
Eine typische Anwendung ist die Erstellung einer grafischen Benutzeroberfläche mit unterschiedlichen Oberflächenmotiven.
Eine abstrakte Fabrik vereinigt die Verantwortlichkeiten „Zusammenfassung der Objektgenerierung an einer Stelle“ und „Möglichkeit zu abstrakten Konstruktoren“ (siehe auch unten unter „Verwandte Entwurfsmuster“).
Neue Produktarten lassen sich schwer hinzufügen, da in allen konkreten Fabriken Änderungen vorzunehmen sind.
Wegen der gemeinsamen Komplexität der beiden wesentlichen Verantwortungen („Zusammenfassung der Objektgenerierung an einer Stelle“ und „Möglichkeit zu abstrakten Konstruktoren“) ist dieses Entwurfsmuster für die Analyse praktisch irrelevant.
Es soll eine Spielesammlung per Software entwickelt werden. Die verwendeten Klassen sind dabei
Ein Klient (z. B. eine Instanz einer Spieler- oder Spielleiter-Klasse) kann sich von der abstrakten Fabrik Spielfiguren bzw. ein Spielbrett erstellen lassen. Je nachdem, welches konkrete Spiel gespielt wird, liefert beispielsweise
// abstraktes Produkt A abstract class Spielbrett { abstract function aufstellen(); } // abstraktes Produkt B abstract class Spielfigur { abstract function bewegen(); } // abstrakte Fabrik abstract class Spielfabrik { abstract function SpielbrettErzeugen(); abstract function SpielfigurErzeugen(); } // konkrete Fabrik 1 class Spielfabrik1 extends Spielfabrik { public function SpielbrettErzeugen() { return new Spielbrett1(); } public function SpielfigurErzeugen() { return new Spielfigur1(); } } // konkrete Fabrik 2 class Spielfabrik2 extends Spielfabrik { public function SpielbrettErzeugen() { return new Spielbrett2(); } public function SpielfigurErzeugen() { return new Spielfigur2(); } } class Spielbrett1 extends Spielbrett { public function aufstellen() { write_line("Spielbrett1 aufgestellt."); } } class Spielfigur1 extends Spielfigur { public function bewegen() { write_line("Spielfigur1 bewegt."); } } class Spielbrett2 extends Spielbrett { public function aufstellen() { write_line("Spielbrett2 aufgestellt."); } } class Spielfigur2 extends Spielfigur { public function bewegen() { write_line("Spielfigur2 bewegt."); } } function Test(Spielfabrik $fabrik) { $brett = $fabrik->SpielbrettErzeugen(); $figur = $fabrik->SpielfigurErzeugen(); $brett->aufstellen(); $figur->bewegen(); } function write_line($text) { print $text.'<br/>'; } Test(new Spielfabrik1()); Test(new Spielfabrik2());
Ausgabe:
Spielbrett1 aufgestellt. Spielfigur1 bewegt. Spielbrett2 aufgestellt. Spielfigur2 bewegt.
Die abstrakte Fabrik ist einfach eine mehrfache Anwendung der Fabrikmethode. Die abstrakte Fabrik kann daher eine ganze Produktfamilie austauschbar machen, während sich die Fabrikmethode nur auf ein Produkt bezieht.
Soll generell eine zusätzliche Hierarchie von Fabriken zu einer Hierarchie von Produkten vermieden werden, kann das Muster des Prototyps verwendet werden. Bei diesem Muster werden zur Erzeugung neuer Objekte prototypische Instanzen kopiert.