Factory Method-mønsteret
Definér en factory-metode i en basisklasse, og lad underklasserne afgøre, hvilket produkt der skal oprettes.
Factory Method-mønsteret er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Factory Method-mønsterets formål
Factory Method definerer en grænseflade til at oprette et objekt, men lader underklasserne afgøre, hvilken klasse der skal instantieres. Det afkobler oprettelseslogikken fra klientkoden.
Problemet uden Factory Method
Uden en fabrik er klientkoden fyldt med kald til new ConcreteClass(). Hvis du tilføjer en ny variant, skal du ændre alle kaldesteder — hvilket overtræder åben/lukket-princippet.
// 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 opretterklasse
Definér en abstrakt opretterklasse med fabriksmetoden createProduct(). Underklasserne tilsidesætter den, så den returnerer bestemte produkttyper.
public abstract class Dialog {
public void render() {
Button btn = createButton(); // factory method
btn.onClick();
}
protected abstract Button createButton();
}Konkrete oprettere
Hver underklasse tilsidesætter fabriksmetoden, så den returnerer det passende produkt uden at ændre den omgivende algoritme 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(); }
}Produktgrænsefladen
Alle konkrete produkter implementerer en fælles grænseflade, så opretteren kan arbejde 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 fabriksmetoder kontra Factory Method-mønsteret
En statisk fabriksmetode (f.eks. LocalDate.of()) er en navngivningskonvention, ikke GoF-mønsteret. GoF-mønsteret bruger nedarvning, mens statiske fabrikker bruger statiske metoder på en enkelt klasse.
// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchyParametriseret fabriksmetode
Send en parameter til fabriksmetoden for at vælge mellem flere produkter uden at kræve 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
Brug generiske typer til at gøre fabriksmetoden typesikker og genanvendelig på tværs af forskellige produktfamilier.
public abstract class Repository<T, ID> {
public abstract T findById(ID id);
protected abstract T createEmpty(); // factory method
}Registrering af fabrikker med et Map
En registerbaseret fabrik gemmer en Map fra typestrenge til Supplier-lambdaer. Det undgår kæder af if-else og gør registreringen 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 opretter én produkttype via nedarvning. Abstract Factory opretter familier af relaterede produkter via komposition. Brug Factory Method, når ét produkt varierer, og Abstract Factory, når en hel produktpakke skal variere samlet.
Eksempel fra den virkelige verden: Logger Factory
SLF4J's LoggerFactory.getLogger(Class) er en statisk fabrik, der returnerer den korrekte loggerimplementering (Logback, Log4j eller JUL), uden at kaldende kode behøver at vide hvilken.
Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");Hurtigt tjek
Hvad er den vigtigste egenskab ved Factory Method-mønsteret?
Opsummering
Factory Method afkobler objektoprettelse fra klienten ved at placere beslutningen om instantiering i tilsidesættelige metoder i underklasser. Brug mønsteret, når en klasse ikke på forhånd kan vide, hvilke objekter den skal oprette.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Factory Method-mønsteret” gratis?
Ja — hele teksten til “Factory Method-mønsteret” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Factory Method-mønsteret”?
Definér en factory-metode i en basisklasse, og lad underklasserne afgøre, hvilket produkt der skal oprettes. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Factory Method-mønsteret”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Singleton: trådsikre implementeringer
- Factory Method-mønsteret
- Abstract Factory til produktfamilier
- Builder-mønsteret med fluent API