0Pricing
Java Academy · Lektion

Factory-Method-Pattern

Definieren Sie eine Factory-Methode in einer Basisklasse und lassen Sie Unterklassen entscheiden, welches Produkt erstellt wird.

Factory-Method-Pattern ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Zweck des Factory-Method-Musters

Das Factory-Method-Muster definiert eine Schnittstelle zum Erzeugen eines Objekts, überlässt es aber den Unterklassen, welche Klasse instanziiert wird. Dadurch wird die Erzeugungslogik vom Clientcode entkoppelt.

Das Problem ohne das Factory-Method-Muster

Ohne eine Factory ist der Clientcode mit Aufrufen von new ConcreteClass() übersät. Eine neue Variante hinzuzufügen bedeutet, jede Aufrufstelle zu ändern – ein Verstoß gegen das Open-Closed-Prinzip.

// Client knows too much:
Shape shape;
if (type.equals("circle")) shape = new Circle(r);
else if (type.equals("rect")) shape = new Rectangle(w, h);
// Every new shape requires editing this code.

Die abstrakte Erzeugerklasse

Definieren Sie eine abstrakte Erzeugerklasse mit der Factory-Methode createProduct(). Unterklassen überschreiben sie, um bestimmte Produkttypen zurückzugeben.

public abstract class Dialog {
    public void render() {
        Button btn = createButton(); // factory method
        btn.onClick();
    }
    protected abstract Button createButton();
}

Konkrete Erzeuger

Jede Unterklasse überschreibt die Factory-Methode, um das passende Produkt zurückzugeben, ohne den umgebenden Algorithmus in der Basisklasse zu ändern.

public class WindowsDialog extends Dialog {
    @Override
    protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
    @Override
    protected Button createButton() { return new HtmlButton(); }
}

Die Produktschnittstelle

Alle konkreten Produkte implementieren eine gemeinsame Schnittstelle, damit der Erzeuger generisch mit ihnen arbeiten kann.

public interface Button {
    void onClick();
    void render();
}
public class WindowsButton implements Button {
    public void onClick() { System.out.println("Windows click"); }
    public void render() { System.out.println("Render Windows button"); }
}

Statische Factory-Methoden im Vergleich zum Factory-Method-Muster

Eine statische Factory-Methode (z. B. LocalDate.of()) ist eine Namenskonvention, nicht das GoF-Muster. Das GoF-Muster verwendet Vererbung; statische Factorys verwenden statische Methoden in einer einzigen Klasse.

// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchy

Parametrisierte Factory-Methode

Übergeben Sie der Factory-Methode einen Parameter, um zwischen mehreren Produkten auszuwählen, ohne für jedes Produkt eine eigene Unterklasse zu benötigen.

public class ShapeFactory {
    public static Shape create(String type, double... dims) {
        return switch (type) {
            case "circle"    -> new Circle(dims[0]);
            case "rectangle" -> new Rectangle(dims[0], dims[1]);
            default -> throw new IllegalArgumentException("Unknown: " + type);
        };
    }
}

Factory-Method-Muster mit Generics

Verwenden Sie Generics, um die Factory-Methode typsicher zu machen und für verschiedene Produktfamilien wiederzuverwenden.

public abstract class Repository<T, ID> {
    public abstract T findById(ID id);
    protected abstract T createEmpty(); // factory method
}

Factorys mit einer Map registrieren

Eine registrierungsbasierte Factory speichert eine Map von Typzeichenfolgen zu Supplier-Lambdas. Dadurch werden if-else-Ketten vermieden und Registrierungen dynamisch ermöglicht.

Map<String, Supplier<Notification>> registry = new HashMap<>();
registry.put("email", EmailNotification::new);
registry.put("sms",   SmsNotification::new);
Notification n = registry.getOrDefault(type, DefaultNotification::new).get();

Factory-Method-Muster im Vergleich zum Abstract-Factory-Muster

Das Factory-Method-Muster erzeugt über Vererbung einen Produkttyp. Das Abstract-Factory-Muster erzeugt über Komposition Familien verwandter Produkte. Verwenden Sie das Factory-Method-Muster, wenn sich ein Produkt unterscheidet, und das Abstract-Factory-Muster, wenn sich eine ganze zusammengehörige Produktfamilie unterscheidet.

Praxisbeispiel: Logger-Factory

LoggerFactory.getLogger(Class) von SLF4J ist eine statische Factory, die die passende Logger-Implementierung (Logback, Log4j, JUL) zurückgibt, ohne dass der Aufrufer wissen muss, um welche es sich handelt.

Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");

Kurze Überprüfung

Was ist das wichtigste Merkmal des Factory-Method-Musters?

Zusammenfassung

Das Factory-Method-Muster entkoppelt die Objekterzeugung vom Client, indem die Entscheidung über die Instanziierung in überschreibbare Methoden von Unterklassen verlagert wird. Verwenden Sie es, wenn eine Klasse nicht vorhersehen kann, welche Objekte sie erzeugen muss.

Häufig gestellte Fragen

Ist die Lektion „Factory-Method-Pattern“ kostenlos?

Ja — der vollständige Text von „Factory-Method-Pattern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Factory-Method-Pattern“?

Definieren Sie eine Factory-Methode in einer Basisklasse und lassen Sie Unterklassen entscheiden, welches Produkt erstellt wird. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Factory-Method-Pattern“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Singleton: Threadsichere Implementierungen
  2. Factory-Method-Pattern
  3. Abstract Factory für Produktfamilien
  4. Builder-Pattern mit Fluent API
← Zurück zu Java Academy