Das Factory Pattern entkoppelt Objekterzeugung von der Anwendung. Lernen Sie typische Praxisfälle, Abgrenzungen zu Builder und Dependency Injection sowie Kriterien für wartbare Architektur und realistischen Entwicklungsaufwand.
Eine Factory ist sinnvoll, wenn eine Anwendung zwischen mehreren Implementierungen wählen
oder Objekte abhängig von Konfiguration und Laufzeitbedingungen erzeugen muss. Bleibt eine Implementierung voraussichtlich stabil, ist direkte Instanziierung meist klarer und günstiger zu pflegen.
Das Pattern trennt die Objekterzeugung vom aufrufenden Code und kann dadurch Refactoring sowie spätere Erweiterungen erleichtern. Es ersetzt jedoch keine Architekturentscheidung: Zusätzliche Klassen und Schnittstellen erhöhen auch den Wartungsaufwand.
Für Teams und Entwicklungsdienstleister ist vor allem wichtig, den erwarteten Wechselbedarf realistisch einzuschätzen. Erst dann lässt sich beurteilen, ob sich eine Factory, eine Dependency-Injection-Lösung oder bewusst einfacher Code lohnt.
Auf einen Blick
- Factory einsetzen, wenn Implementierungen wechseln können oder Objekte variabel erzeugt werden müssen.
- Direkte Instanziierung bleibt passend, wenn es nur eine stabile Implementierung ohne absehbaren Wechsel gibt.
- Factory, Builder und Dependency Injection lösen unterschiedliche Probleme und lassen sich teilweise kombinieren.
| Ansatz | Geeignet für | Wartungsaufwand | Erweiterbarkeit |
|---|---|---|---|
| Simple Factory | Überschaubare Auswahl zwischen mehreren Implementierungen | Moderat; Auswahlregeln müssen gepflegt werden | Gut, solange die Auswahl zentral bleibt |
| Factory Method | Erzeugung soll durch Unterklassen oder Creator-Implementierungen variieren | Höher durch zusätzliche Abstraktionen | Gut bei klaren Erweiterungspunkten |
| Abstract Factory | Zusammengehörige Objektfamilien, etwa UI-Komponenten je Plattform | Höher; mehrere Produktarten werden koordiniert | Stark bei wechselnden Familien |
| Builder | Komplexer schrittweiser Aufbau eines Objekts | Abhängig von der Objektkomplexität | Gut für variable Konstruktion |
| Dependency Injection | Austauschbare Abhängigkeiten und bessere Testbarkeit | Abhängig von Container und Architektur | Gut; kann mit Factories kombiniert werden |
Die kurze Antwort: Wann eine Factory sinnvoll ist
Eine Factory lohnt sich vor allem dann, wenn der aufrufende Code keine konkrete Klasse kennen soll. Statt selbst einen bestimmten Client, Exporter oder Dienst zu instanziieren, fragt er eine Factory nach einer passenden Implementierung. Die Auswahl bleibt damit an einer klar definierten Stelle.
Entkopplung bei mehreren möglichen Implementierungen
Stellen Sie sich vor, eine Anwendung unterstützt mehrere Zahlungsanbieter, Versanddienstleister oder Speicherlösungen. Die Fachlogik soll dann nicht überall wissen müssen, welche konkrete Implementierung aktuell aktiv ist. Eine Factory kann anhand einer Konfiguration oder eines Laufzeitmerkmals die passende Variante bereitstellen.
Der Vorteil liegt nicht nur in weniger direkten Abhängigkeiten. Auch Tests werden übersichtlicher, wenn der aufrufende Code gegen eine Schnittstelle arbeitet. Welche Implementierung tatsächlich verwendet wird, kann gezielt geprüft oder ersetzt werden.
Direkte Instanziierung bleibt bei einfachen, stabilen Fällen oft besser
Eine Factory ist kein Qualitätsmerkmal für sich. Gibt es nur eine konkrete Implementierung und ist kein Wechsel absehbar, bringt eine zusätzliche Factory-Klasse oft nur mehr Dateien, mehr Indirektion und mehr Pflegeaufwand. In solchen Fällen ist eine direkte Erzeugung häufig die verständlichere Architekturentscheidung.
Die entscheidende Frage lautet: Wie wahrscheinlich ist eine fachliche oder technische Änderung an dieser Stelle? Nicht jede bedingte Instanziierung rechtfertigt ein eigenes Pattern.
Praxisbeispiele aus Web, Backend und Unternehmenssoftware
Factories begegnen Teams besonders dort, wo Integrationen, Konfigurationen oder Ausgabeformate variieren. Entscheidend ist nicht die Branche, sondern die Tatsache, dass mehrere austauschbare Implementierungen existieren oder erwartet werden.
Zahlungsanbieter oder Versanddienstleister zur Laufzeit auswählen
Ein Checkout kann abhängig von Konfiguration, Markt oder Geschäftsregel unterschiedliche Zahlungs- oder Versanddienste verwenden. Die Bestelllogik arbeitet dabei idealerweise mit einer gemeinsamen Schnittstelle. Die Factory übernimmt die Auswahl der konkreten Anbindung.
Wichtig: Die Factory sollte nur auswählen und erzeugen. Fachliche Geschäftsregeln, umfangreiche Validierungen und Netzwerklogik gehören nicht gesammelt in diese Klasse. Sonst entsteht schnell eine schwer wartbare God Factory.
Datenbank-, Speicher- und API-Clients anhand der Konfiguration erzeugen
Backend-Anwendungen benötigen häufig Clients für Datenbanken, Speicherorte oder externe APIs. Wenn die konkrete Anbindung durch Konfiguration bestimmt wird, kann eine Factory die Erstellung zentralisieren. Der restliche Code bleibt dadurch stärker auf die jeweilige Schnittstelle ausgerichtet.
Dependency Injection kann hier ergänzen: Injection liefert Abhängigkeiten in eine Komponente, während eine Factory die Auswahl oder Erstellung zur Laufzeit steuert. Beide Ansätze stehen nicht zwingend in Konkurrenz.
Dokumentexporte für PDF, CSV oder XML bereitstellen
Ein Exportmodul kann verschiedene Formate anbieten, während der aufrufende Bereich nur einen einheitlichen Exportvertrag kennt. Die Factory liefert dann beispielsweise einen passenden PDF-, CSV- oder XML-Exporter. Das erleichtert Erweiterungen, wenn später ein weiteres Format hinzukommt.
Ist allerdings dauerhaft nur ein Format vorgesehen, sollte ein Team den Zusatznutzen kritisch prüfen. Eine Abstraktion auf Vorrat kann die Lesbarkeit verschlechtern.
Factory, Builder und Dependency Injection im Vergleich
Diese Begriffe werden häufig gemeinsam genannt, erfüllen aber unterschiedliche Aufgaben. Eine saubere Abgrenzung verhindert unnötige Architekturarbeit und hilft bei der Auswahl von Team-Softwareentwicklung, Architekturberatung oder Refactoring-Unterstützung.
Entscheidungstabelle: Zweck, Komplexität und Wartungsaufwand
| Werkzeug | Kernzweck | Typisches Signal |
|---|---|---|
| Factory | Passende Implementierung auswählen oder erzeugen | Mehrere konkrete Varianten sollen verborgen bleiben |
| Builder | Ein Objekt schrittweise zusammensetzen | Viele optionale Werte oder komplexer Aufbau |
| Dependency Injection | Abhängigkeiten von außen bereitstellen | Komponenten sollen testbar und austauschbar sein |
Welche Lösung bei variabler Konfiguration, komplexem Aufbau oder Testbarkeit passt
Bei variabler Implementierung ist eine Factory naheliegend. Bei einem Objekt mit vielen optionalen Einstellungen passt ein Builder eher zum Problem. Für testbare Komponenten und klar sichtbare Abhängigkeiten ist Dependency Injection besonders hilfreich.
In einer größeren Anwendung können alle drei Ansätze zusammen vorkommen: Ein injizierter Dienst verwendet eine Factory, um abhängig von einer Laufzeitentscheidung eine konkrete Implementierung bereitzustellen. Ob diese Kombination sinnvoll ist, hängt jedoch von Sprache, bestehender Architektur, Teamgröße und erwarteten Erweiterungen ab.
Implementierung im Team: Ablauf, Tests und typische Fehler
Eine Factory ist am wartbarsten, wenn das Team die Austauschbarkeit nicht nur benennt, sondern konsequent in Schnittstellen, Tests und Verantwortlichkeiten umsetzt.
Schnittstellen zuerst definieren und konkrete Klassen austauschbar halten
Definieren Sie zunächst, welche Fähigkeit der aufrufende Code benötigt. Danach können konkrete Implementierungen diesen Vertrag erfüllen. Die Factory sollte auf dieser Grundlage auswählen, ohne dass die Fachlogik Details einzelner Klassen kennen muss.

Für eine Übergabe an ein internes Team oder einen Entwicklungsdienstleister ist hilfreich, Auswahlregeln, Konfigurationsquellen und erwartete Erweiterungen schriftlich festzuhalten. Das reduziert Rückfragen bei Architekturberatung und bei späterem Refactoring.
Fehler vermeiden: God Factory, zu viele Abstraktionen und versteckte Abhängigkeiten
Ein häufiger Fehler sind Factory-Klassen, die immer größer werden und neben der Erzeugung auch Fachlogik, Konfigurationsauswertung und technische Sonderfälle übernehmen. Ebenso problematisch sind Schnittstellen ohne realistischen Wechselbedarf.
Auch versteckte Abhängigkeiten verdienen Aufmerksamkeit. Wenn eine Factory intern auf schwer erkennbare globale Zustände zugreift, wird das Testen und Nachvollziehen unnötig schwierig. Klare Eingaben und klar definierte Auswahlregeln sind meist robuster.
Unit-Tests für Auswahlregeln und Fehlerfälle planen
Tests sollten nicht nur prüfen, ob eine konkrete Klasse erzeugt wird. Relevant sind auch Auswahlregeln, ungültige Konfigurationen und erwartete Fehlerfälle. So bleibt nachvollziehbar, welche Variante unter welchen Bedingungen verwendet werden soll.
Bei einem Refactoring ist außerdem zu prüfen, ob bestehende Tests die betroffenen Integrationen ausreichend abdecken. Ohne Einblick in die Codebasis lässt sich der konkrete Aufwand jedoch nicht verlässlich beurteilen.
Aufwand und externe Umsetzung realistisch beurteilen
Die Einführung einer Factory kann klein beginnen oder ein umfassendes Refactoring auslösen. Der Aufwand entsteht nicht allein durch neue Klassen, sondern durch Abhängigkeiten, Tests und vorhandene Integrationen.
Faktoren für Refactoring-Aufwand: Codealter, Testabdeckung und Integrationen
Eine ältere Codebasis mit vielen direkten Instanziierungen kann mehr Analyse erfordern als ein klar modularisiertes System. Ebenso wichtig sind vorhandene Tests und die Zahl der betroffenen Datenbank-, API- oder Service-Integrationen. Je stärker die konkrete Erzeugung im Code verteilt ist, desto sorgfältiger muss eine Umstellung geplant werden.
Konkrete Kosten für Refactoring, externe Entwicklung oder Architekturberatung lassen sich ohne Leistungsumfang und Codebasis nicht seriös nennen. Ein belastbarer Vergleich beginnt daher mit einer technischen Bestandsaufnahme statt mit pauschalen Versprechen.
Welche Anforderungen ein Entwicklungsdienstleister für ein belastbares Angebot benötigt
Für eine erste Einschätzung braucht ein Entwicklungsdienstleister vor allem das gewünschte Zielbild: Welche Implementierungen sollen austauschbar sein? Woher kommen Auswahlregeln und Konfiguration? Welche Bereiche dürfen sich nicht verändern? Zusätzlich helfen Informationen zur bestehenden Architektur, zu Schnittstellen, Tests und Integrationen.
Je klarer diese Punkte beschrieben sind, desto besser lässt sich unterscheiden, ob eine kleine Refactoring-Unterstützung genügt oder ob eine umfassendere Architekturberatung sinnvoll sein kann.
Auswahlkriterien und Vergleichszusammenfassung
Prüfen Sie vor der Entscheidung diese Punkte:
- Gibt es heute oder absehbar mehrere konkrete Implementierungen?
- Muss die Auswahl anhand von Konfiguration oder zur Laufzeit erfolgen?
- Ist die Objekterzeugung an mehreren Stellen verteilt?
- Kann eine gemeinsame Schnittstelle den tatsächlichen Bedarf sauber ausdrücken?
- Sind Tests für Auswahlregeln und Fehlerfälle vorgesehen?
- Übersteigt der erwartete Nutzen den zusätzlichen Pflegeaufwand?
Wenn mehrere Punkte offen sind, sollten Sie Anforderungen und Architekturaufwand vor einem Refactoring strukturiert prüfen. Offizielle Leistungsbeschreibungen, Referenzprojekte und konkrete Prüfungsbedingungen eines Entwicklungsdienstleisters lassen sich auf den jeweiligen Angebotsseiten vergleichen.
Zum Schluss
Das Factory Pattern schafft Nutzen, wenn es echte Variabilität hinter einer stabilen Schnittstelle bündelt. Für stabile, einfache Fälle bleibt direkte Instanziierung oft die bessere Wahl. Entscheidend ist nicht die Anzahl eingesetzter Patterns, sondern eine Architektur, die das Team nachvollziehen, testen und erweitern kann. Bei unklarer Ausgangslage ist eine strukturierte Analyse vor dem Refactoring sinnvoller als eine vorschnelle Generalisierung.
Nützliche Zusatzinformationen
Simple Factory ist ein pragmatischer, verbreiteter Ansatz, wird jedoch meist nicht als eigenständiges GoF-Muster geführt.
Factory Method verlagert die konkrete Instanziierung häufig an Unterklassen oder Implementierungen einer Creator-Schnittstelle.
Abstract Factory eignet sich für zusammengehörige Objektfamilien, etwa UI-Komponenten für unterschiedliche Plattformen.
Wichtige Hinweise
Welche Variante in einem konkreten Projekt passt, hängt von Programmiersprache, vorhandener Architektur, Teamgröße und erwarteten Erweiterungen ab. Nicht jede bedingte Erzeugung benötigt eine Factory. Aufwand, Risiken und möglicher Nutzen sollten anhand der tatsächlichen Codebasis, Testabdeckung und Integrationen geprüft werden.
Häufig gestellte Fragen
Q1. Wann sollte ich statt direkter Objekterzeugung eine Factory verwenden?
A1. Wenn der aufrufende Code nicht wissen soll, welche konkrete Implementierung verwendet wird, oder wenn die Auswahl anhand von Konfiguration beziehungsweise zur Laufzeit erfolgt. Bei nur einer stabilen Implementierung ist direkte Instanziierung häufig einfacher.
Q2. Ist das Factory Pattern für kleine Projekte empfehlenswert oder unnötig komplex?
A2. Die Projektgröße allein entscheidet nicht. Auch ein kleines Projekt kann mehrere wechselnde Implementierungen benötigen. Gibt es keinen realistischen Wechselbedarf, erhöhen Factory-Klassen und Schnittstellen jedoch oft nur die Komplexität.
Q3. Welche Informationen braucht ein Entwicklungsdienstleister, um den Aufwand für ein Factory-Pattern-Refactoring einzuschätzen?
A3. Wichtig sind die aktuelle Codebasis, betroffene Integrationen, vorhandene Tests, gewünschte Schnittstellen, Auswahlregeln und das Zielbild für künftige Erweiterungen. Ohne diese Angaben lassen sich Aufwand und Umfang nicht seriös beziffern.





