Abstract-Factory-Muster
Das Abstract-Factory-Muster bietet eine Schnittstelle zur Erstellung von Familien verwandter Objekte, ohne deren konkrete Klassen zu spezifizieren. Verwende es, wenn dein System unabhängig von der Produkterstellung sein soll, besonders bei mehreren Produktfamilien.
Überblick
Das Abstract-Factory-Muster gruppiert eine Reihe verwandter Factory Methods unter einer Schnittstelle, sodass eine einzige Factory eine ganze Familie kompatibler Produkte erzeugen kann. Das klassische Beispiel ist ein plattformübergreifendes UI-Toolkit: eine WindowsFactory erzeugt WindowsButton + WindowsCheckbox, eine MacFactory erzeugt MacButton + MacCheckbox, und der Rest der App weiß nie, welche Familie verwendet wird.
Wann verwenden
- Du musst Familien verwandter Objekte erzeugen, die zusammen verwendet werden müssen (z.B. UI-Komponenten mit demselben Theme).
- Du willst auf Typebene sicherstellen, dass Produkte verschiedener Familien nicht gemischt werden.
- Die Anwendung soll mit einer einzigen Konfigurationsänderung ganze Produktfamilien wechseln können.
Beispiel
interface Button { render(): void }
interface Checkbox { toggle(): void }
interface UIFactory {
createButton(): Button;
createCheckbox(): Checkbox;
}
class DarkButton implements Button { render() { console.log("dark btn"); } }
class DarkCheckbox implements Checkbox { toggle() { console.log("dark check"); } }
class DarkUIFactory implements UIFactory {
createButton() { return new DarkButton(); }
createCheckbox() { return new DarkCheckbox(); }
}
function renderApp(factory: UIFactory) {
factory.createButton().render();
factory.createCheckbox().toggle();
}Vorteile
- Garantiert, dass Produkte derselben Familie zusammen verwendet werden.
- Isoliert konkrete Klassen — Clients hängen nur von abstrakten Schnittstellen ab.
- Familien (Theme, Plattform, Umgebung) zu tauschen ist eine einzige Codezeile.
Nachteile
- Ein neues Produkt zur Familie hinzuzufügen zwingt jede Factory, es zu implementieren.
- Mehr Klassen und Schnittstellen als ein einzelnes Factory Method — der Anfangsaufwand ist real.
- Übertrieben, wenn du nur eine Familie hast oder Familien selten wechseln.