Factory-Method-Muster
Das Factory-Method-Muster definiert eine Schnittstelle zur Objekterstellung, überlässt aber Unterklassen die Entscheidung, welche Klasse instanziiert wird. Verwende es, wenn du die Objekterstellung von der Verwendung entkoppeln möchtest, um Implementierungen leicht ersetzen zu können.
Überblick
Das Factory-Method-Muster definiert eine Methode zur Objekterstellung, überlässt aber die Wahl der konkreten Klasse Unterklassen (oder Strategien). Client-Code spricht nur mit dem Basistyp und nennt die konkrete Klasse nie, sodass das Hinzufügen einer neuen Variante einfach eine neue Factory einsteckt — ohne Änderungen am Consumer.
Wann verwenden
- Der Client-Code sollte nicht von der konkreten Klasse abhängen, die er instanziiert.
- Du erwartest im Laufe der Zeit neue Produktvarianten und willst jede in ihrer eigenen Factory isolieren.
- Die Objekterstellung erfordert Logik (Config-Lookup, Validierung, Registrierung), die nicht zum Consumer gehört.
Beispiel
interface Transport {
deliver(load: string): void;
}
class Truck implements Transport {
deliver(load: string) { console.log(`LKW liefert ${load}`); }
}
class Ship implements Transport {
deliver(load: string) { console.log(`Schiff liefert ${load}`); }
}
abstract class Logistics {
abstract createTransport(): Transport;
planDelivery(load: string) {
const transport = this.createTransport();
transport.deliver(load);
}
}
class RoadLogistics extends Logistics {
createTransport() { return new Truck(); }
}
class SeaLogistics extends Logistics {
createTransport() { return new Ship(); }
}Vorteile
- Entkoppelt Client-Code von konkreten Klassen — Open/Closed-Prinzip in Aktion.
- Zentralisiert die Konstruktionslogik, sodass Änderungen an einer Stelle stattfinden.
- Macht es einfach, Implementierungen zur Laufzeit oder pro Umgebung auszutauschen.
Nachteile
- Fügt eine zusätzliche Schicht aus Klassen und Indirektion hinzu, die bei kleinen Fällen schwer wirken kann.
- Subclassing-basierte Factories können zu parallelen Klassenhierarchien führen, die schwer zu verfolgen sind.
- Wenn du nur jemals eine Variante hast, ist dieses Muster Over-Engineering.