CREATIONAL

Factory Method

Definire un'interfaccia per creare un oggetto, ma lasciare che le sottoclassi decidano quale classe istanziare.

Il Problema

Il codice diventa dipendente da classi concrete specifiche quando crea oggetti direttamente. Questo rende difficile estendere il sistema con nuovi tipi senza modificare il codice esistente.

La Soluzione

Definire un metodo factory in una classe base che le sottoclassi possono sovrascrivere per specificare quale tipo di oggetto creare. Il codice client lavora con l'interfaccia del factory method, non con classi concrete.

Struttura

Una classe Creator astratta con un factory method astratto, e ConcreteCreator che implementano il metodo per creare istanze concrete.

Partecipanti:
Creator - dichiara il factory method che restituisce un oggetto Product
ConcreteCreator - sovrascrive il factory method per restituire un ConcreteProduct
Product - interfaccia degli oggetti creati dal factory method
ConcreteProduct - implementazione concreta di Product
Esempi di Codice

PROBLEMA: Codice Rigido con Classi Concrete

Quando il codice dipende direttamente da classi concrete, diventa difficile estendere.

JAVASCRIPT
Loading...

SOLUZIONE: Factory Method - Estensibilità

Factory Method permette alle sottoclassi di decidere quale classe istanziare.

JAVASCRIPT
Loading...

Esempio Pratico: Sistema di Export Multi-Formato

Export di report in formati diversi (PDF, Excel, CSV) usando Factory Method.

JAVASCRIPT
Loading...

Confronto: Switch vs Factory Method

Differenza tra codice procedurale e pattern Factory Method.

JAVASCRIPT
Loading...
Esempi nel Mondo Reale
Framework UI - Creazione di componenti diversi per piattaforme diverse (web, mobile, desktop)
Sistema di logging - Diversi logger per console, file, database, cloud
Parser di documenti - Factory per creare parser XML, JSON, CSV in base al tipo di file
Connessioni database - Factory per creare connessioni MySQL, PostgreSQL, MongoDB
Gestione pagamenti - Factory per creare processori Stripe, PayPal, Apple Pay
Quando Usarlo
Quando non sai in anticipo quali tipi di oggetti dovrai creare
Quando vuoi delegare la logica di creazione alle sottoclassi
Quando vuoi fornire estensibilità ai tuoi utenti/library
Quando vuoi localizzare la conoscenza delle classi concrete
Quando NON Usarlo
Quando hai solo un tipo di oggetto da creare
Quando la gerarchia di classi diventa troppo complessa
Quando Simple Factory Pattern è sufficiente