Pattern Factory Method
Definisca un factory method in una classe base e lasci alle sottoclassi la scelta del prodotto da creare.
Pattern Factory Method è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Intento del Factory Method
Factory Method definisce un'interfaccia per la creazione di un oggetto, ma lascia alle sottoclassi la scelta della classe da istanziare. Separa la logica di creazione dal codice client.
Il problema senza Factory Method
Senza una factory, il codice client è disseminato di chiamate new ConcreteClass(). Aggiungere una nuova variante significa modificare ogni punto di chiamata, violando il principio Open/Closed.
// 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.La classe astratta Creator
Definisca una classe astratta creator con un metodo factory createProduct(). Le sottoclassi lo sovrascrivono per restituire tipi di prodotto specifici.
public abstract class Dialog {
public void render() {
Button btn = createButton(); // factory method
btn.onClick();
}
protected abstract Button createButton();
}Creator concreti
Ogni sottoclasse sovrascrive il metodo factory per restituire il prodotto appropriato senza modificare l'algoritmo circostante nella classe base.
public class WindowsDialog extends Dialog {
@Override
protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
@Override
protected Button createButton() { return new HtmlButton(); }
}L'interfaccia del prodotto
Tutti i prodotti concreti implementano un'interfaccia comune, così il creator può lavorare con essi in modo generico.
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"); }
}Metodi factory statici e pattern Factory Method
Un metodo factory statico, ad esempio LocalDate.of(), è una convenzione di denominazione, non il pattern GoF. Il pattern GoF utilizza l'ereditarietà; le factory statiche utilizzano metodi statici su un'unica classe.
// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchyFactory Method parametrizzato
Passi un parametro al metodo factory per scegliere tra diversi prodotti senza dover creare una sottoclasse per ogni prodotto.
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 con i generics
Utilizzi i generics per rendere il metodo factory type-safe e riutilizzabile con diverse famiglie di prodotti.
public abstract class Repository<T, ID> {
public abstract T findById(ID id);
protected abstract T createEmpty(); // factory method
}Registrare le factory con una Map
Una factory basata su un registro memorizza una mappa di stringhe di tipo associate a lambda Supplier, evitando catene di if-else e rendendo dinamica la registrazione.
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 e Abstract Factory
Factory Method crea un solo tipo di prodotto tramite l'ereditarietà. Abstract Factory crea famiglie di prodotti correlati tramite la composizione. Utilizzi Factory Method quando varia un solo prodotto; Abstract Factory quando varia insieme un'intera suite.
Esempio reale: Logger Factory
LoggerFactory.getLogger(Class) di SLF4J è una factory statica che restituisce l'implementazione corretta del logger, Logback, Log4j o JUL, senza che il chiamante debba sapere quale sia.
Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");Verifica rapida
Qual è la caratteristica principale del pattern Factory Method?
Riepilogo
Factory Method separa la creazione degli oggetti dal client, collocando la decisione di istanziazione in metodi sovrascrivibili delle sottoclassi. Lo utilizzi quando una classe non può prevedere quali oggetti dovrà creare.
Domande Frequenti
La lezione «Pattern Factory Method» è gratuita?
Sì — il testo completo di «Pattern Factory Method» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern Factory Method»?
Definisca un factory method in una classe base e lasci alle sottoclassi la scelta del prodotto da creare. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Pattern Factory Method»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Singleton: implementazioni thread-safe
- Pattern Factory Method
- Abstract Factory per famiglie di prodotti
- Pattern Builder con API fluent