Factory Method-mønsteret
Definer en fabrikkmetode i en basisklasse, og la underklassene avgjøre hvilket produkt som skal opprettes.
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 hierarchyParametrisert 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.
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
- Singleton: trådsikre implementasjoner
- Factory Method-mønsteret
- Abstract Factory for produktfamilier
- Builder-mønsteret med Fluent API