Java Academy · Les

Factory Method-patroon

Definieer een factorymethode in een basisklasse en laat subklassen bepalen welk product ze maken.

Les 2 van 413 stappen

Factory Method-patroon is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

De intentie van Factory Method

Factory Method definieert een interface voor het maken van een object, maar laat subklassen bepalen welke klasse moet worden geïnstantieerd. Het ontkoppelt de aanmaaklogica van de clientcode.

Het probleem zonder Factory Method

Zonder een fabriek staat de clientcode vol met aanroepen van new ConcreteClass(). Een nieuwe variant toevoegen betekent dat je elke aanroepplek moet wijzigen — een schending van het open-geslotenprincipe.

// 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.

De abstracte makerklasse

Definieer een abstracte makerklasse met een fabrieksmethode createProduct(). Subklassen overschrijven deze om specifieke producttypen terug te geven.

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

Concrete makers

Elke subklasse overschrijft de fabrieksmethode om het juiste product terug te geven zonder het omliggende algoritme in de basisklasse te wijzigen.

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

De productinterface

Alle concrete producten implementeren een gemeenschappelijke interface, zodat de maker er generiek mee kan werken.

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 fabrieksmethoden versus het Factory Method-patroon

Een statische fabrieksmethode (bijvoorbeeld LocalDate.of()) is een naamgevingsconventie, niet het GoF-patroon. Het GoF-patroon gebruikt overerving; statische fabrieken gebruiken statische methoden op één klasse.

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

Geparametriseerde fabrieksmethode

Geef een parameter door aan de fabrieksmethode om te kiezen uit meerdere producten, zonder dat je voor elk product een aparte subklasse nodig hebt.

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 met generieke typen

Gebruik generieke typen om de fabrieksmethode typeveilig en herbruikbaar te maken voor verschillende productfamilies.

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

Fabrieken registreren met een map

Een op een register gebaseerde fabriek bewaart een map met typeteksten als sleutels en Supplier-lambdas als waarden. Zo vermijd je if-else-ketens en maak je registratie dynamisch.

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 versus Abstract Factory

Factory Method maakt via overerving één producttype. Abstract Factory maakt via compositie families van verwante producten. Gebruik Factory Method wanneer één product varieert; gebruik Abstract Factory wanneer een hele reeks producten gezamenlijk varieert.

Voorbeeld uit de praktijk: loggerfabriek

SLF4J's LoggerFactory.getLogger(Class) is een statische fabriek die de juiste loggerimplementatie (Logback, Log4j, JUL) teruggeeft zonder dat de aanroeper weet welke dat is.

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

Korte controle

Wat is het belangrijkste kenmerk van het Factory Method-patroon?

Samenvatting

Factory Method ontkoppelt het maken van objecten van de client door de instantiatiebeslissing in overschrijfbare methoden van subklassen te plaatsen. Gebruik het wanneer een klasse niet vooraf kan bepalen welke objecten ze moet maken.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Factory Method-patroon” gratis?

Ja — de volledige tekst van “Factory Method-patroon” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Factory Method-patroon”?

Definieer een factorymethode in een basisklasse en laat subklassen bepalen welk product ze maken. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Factory Method-patroon”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Singleton: threadveilige implementaties
  2. Factory Method-patroon
  3. Abstract Factory voor productfamilies
  4. Builder-patroon met Fluent API
← Terug naar Java Academy