Java Academy · leksjon

Factory Method-mønsteret

Definer en fabrikkmetode i en basisklasse, og la underklassene avgjøre hvilket produkt som skal opprettes.

Leksjon 2 av 413 trinn

Factory Method-mønsteret er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hensikten med Factory Method

Factory Method definerer et grensesnitt for å opprette et objekt, men lar underklasser avgjøre hvilken klasse som skal instansieres. Det kobler opprettelseslogikken fra klientkoden.

Problemet uten Factory Method

Uten en fabrikk er klientkoden full av kall til new ConcreteClass(). Når en ny variant skal legges til, må hvert kallested endres — et brudd på Open/Closed-prinsippet.

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

Den abstrakte oppretterklassen

Definer en abstrakt oppretterklasse med en createProduct()-fabrikkmetode. Underklassene overstyrer den slik at den returnerer bestemte produkttyper.

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

Konkrete opprettere

Hver underklasse overstyrer fabrikkmetoden slik at den returnerer riktig produkt, uten å endre den omkringliggende algoritmen i basisklassen.

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

Produktgrensesnittet

Alle konkrete produkter implementerer et felles grensesnitt, slik at oppretteren kan arbeide generisk med dem.

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"); }
}

Statiske fabrikkmetoder kontra Factory Method-mønsteret

En statisk fabrikkmetode, for eksempel LocalDate.of(), er en navnekonvensjon, ikke GoF-mønsteret. GoF-mønsteret bruker arv, mens statiske fabrikker bruker statiske metoder i én enkelt klasse.

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

Parametrisert fabrikkmetode

Send en parameter til fabrikkmetoden for å velge mellom flere produkter, uten at det kreves en underklasse for hvert produkt.

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 med generiske typer

Bruk generiske typer for å gjøre fabrikkmetoden typesikker og gjenbrukbar på tvers av ulike produktfamilier.

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

Registrere fabrikker med et Map

En registerbasert fabrikk lagrer en kobling fra typestrenger til Supplier-lambdaer. Dermed unngår man if-else-kjeder, og registreringen blir dynamisk.

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

Factory Method oppretter én produkttype ved hjelp av arv. Abstract Factory oppretter familier av relaterte produkter ved hjelp av komposisjon. Bruk Factory Method når ett produkt varierer, og Abstract Factory når en hel produktserie varierer samlet.

Eksempel fra virkeligheten: Logger Factory

SLF4J sin LoggerFactory.getLogger(Class) er en statisk fabrikk som returnerer riktig loggerimplementasjon — Logback, Log4j eller JUL — uten at kalleren trenger å vite hvilken det er.

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

Kort kontrollspørsmål

Hva er den viktigste egenskapen ved Factory Method-mønsteret?

Oppsummering

Factory Method kobler objektopprettelsen fra klienten ved å plassere avgjørelsen om instansiering i overstyrbare metoder i underklasser. Bruk mønsteret når en klasse ikke kan forutse hvilke objekter den må opprette.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Factory Method-mønsteret» gratis?

Ja – hele teksten i «Factory Method-mønsteret» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Factory Method-mønsteret»?

Definer en fabrikkmetode i en basisklasse, og la underklassene avgjøre hvilket produkt som skal opprettes. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Factory Method-mønsteret»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Singleton: trådsikre implementasjoner
  2. Factory Method-mønsteret
  3. Abstract Factory for produktfamilier
  4. Builder-mønsteret med Fluent API
← Tilbake til Java Academy