Das Abstract Factory-Muster ist ein Erstellungsmuster, das eine Möglichkeit bietet, eine Reihe separater Fabriken mit demselben Thema zu kapseln. Sein Kern besteht darin, „Schnittstellen bereitzustellen, um eine Reihe verwandter oder unabhängiger Objekte zu erstellen, ohne die spezifischen Klassen dieser Objekte anzugeben“.
Das abstrakte Fabrikmuster stellt eine Schnittstelle zum Erstellen systembezogener oder voneinander abhängiger Objekte bereit, ohne deren konkrete Klassen anzugeben.
Hauptrollen im abstrakten Factory-Muster
Abstract Factory-Rolle: Deklariert die Schnittstelle zum Erstellen abstrakter Produktobjekte
Concrete Factory-Rolle: Implementiert Erstellungsvorgänge für Produktobjekte
Abstrakte Produktrolle: deklariert die Schnittstelle eines Produkttyps
Konkrete Produktrolle: implementiert die durch die abstrakte Produktrolle definierte Schnittstelle
Dies ähnelt dem Factory-Methodenmodell. Wir wollen nicht mehr nur einen Burger, sondern vielleicht 4 Burger und 2 Chicken Wings. Wir sagen dem Kellner immer noch, dass der Kellner zu der bestimmten Fabrik gehört. Das spezifische Produkt ist das, worüber wir sprechen ungefähr. Der Kellner fragte nach dem Essen.
Anwendbarkeit
Wenn ein System unabhängig von seinen Produkten erstellt, zusammengestellt und dargestellt werden soll.
Wenn ein System mit einer von mehreren Produktfamilien konfiguriert werden soll.
Wenn es notwendig ist, das Design einer Reihe verwandter Produktobjekte zur gemeinsamen Verwendung hervorzuheben.
Stellen Sie eine Produktklassenbibliothek bereit und möchten Sie nur deren Schnittstellen und nicht deren Implementierungen anzeigen.
Klassendiagramm
Instanz
<?php class Button{} class Border{} class MacButton extends Button{} class WinButton extends Button{} class MacBorder extends Border{} class WinBorder extends Border{} interface AbstractFactory { public function CreateButton(); public function CreateBorder(); } class MacFactory implements AbstractFactory{ public function CreateButton(){ return new MacButton(); } public function CreateBorder(){ return new MacBorder(); } } class WinFactory implements AbstractFactory{ public function CreateButton(){ return new WinButton(); } public function CreateBorder(){ return new WinBorder(); } } ?>
In diesem Beispiel implementiert die Factory-Klasse eine Reihe von Factory-Methoden. Wenn Sie neue Funktionen hinzufügen möchten, können Sie eine neue Schnittstelle hinzufügen und die neue Factory-Klasse diese Schnittstelle implementieren lassen, ohne die vorhandene Factory-Klasse zu ändern.
Vor- und Nachteile
Vorteile
Trennt bestimmte Klassen
Erleichtert das Hinzufügen oder Ersetzen von Produktfamilien
Gut für die Produktkonsistenz
Nachteile
Schwierigkeit bei der Unterstützung neuer Produkttypen. Dies liegt daran, dass die AbstractFactory-Schnittstelle die Sammlung der Produkte bestimmt, die erstellt werden können. Die Unterstützung neuer Produkttypen erfordert eine Erweiterung der Factory-Zugriffsschnittstelle, was zu Änderungen an der AbstractFactory-Klasse und allen ihren Unterklassen führt.