Il Factory Method è uno dei design pattern fondamentali per l’implementazione del concetto di factories. Come altri pattern creazionali, esso indirizza il problema della creazione di oggetti senza specificarne l’esatta classe. L’idea è utilizzare un metodo factory che ritorna una interfaccia dell’oggetto che voglio creare invece di utilizzare direttamente il costruttore della classe. In questo modo la superclasse o il chiamante utilizzerà l’oggetto senza saperne il suo tipo specifico ma solo la sua interfaccia. Usare metodi factory spesso non è una grande idea in quanto rompe la Principi SOLID. Liskov Substitution Principle.
Rapporto con altri pattern creazionali
Il Factory è il pattern creazionale più semplice e tendenzialmente si parte sempre da quello. Se il pattern genera troppe sottoclassi spesso conviene migrare verso l’Abstract Factory
, il Pattern Prototype o il Pattern Builder, che sono più flessibili ma leggermente più complessi.
Factory vs Abstract Factory
Spesso c’è confusione sulla differenza tra i due pattern e quando usare uno invece che l’altro.
Un primo punto fondamentale è che nel Factory
ho un solo metodo, chiamato metodo factory, in una classe che potenzialmente può fare anche altro; l’Abstract Factory
invece prevede la creazione di più classi complesse.
- Il metodo Factory si usa per creare un solo prodotto, l’Abstract Factory invece si occupa di creare famiglie di oggetti o comunque oggetti legati tra loro;
- Nel
Factory
il metodo che costruisce la classe è un normale metodo (da overridare in una classe figlia per specificare l’istanza da creare), mentre nell’Abstract Factory
viene ddelegata tramite composizione ad una classe terza; Il primo usa quindi l’ereditarietà mentre il secondo la composizione. - Tipicamente una classe contenente un metodo Factory può contenere anche altri metodi, non serve solo a creare oggetti. Una classe factory dell’
Abstract Factory
invece serve solo a creare oggetti; - Il
Factory
nasconde la costruzione di un singolo oggetto, mentre l’Abstract Factory
di una serie di oggetti;
Factory
Abstract Factory
Esempio 1 - Ereditarietà
Nell’esempio seguente abbiamo la creazione di oggetti IProduct
, in particolare ConcreteProduct1
e ConcreteProduct2
.
La classe che li crea è la classe Creator
che definisce solo il metodo astratto, saranno le sue figlie a indicarne la classe concreta.
Client
Utilizzare il metodo Factory viene utilizzato principalmente perchè così il client non istanzia gli oggetti effettivi e non conosce nemmeno come sono fatti: delega alla factory la creazione e poi il client si occupa solo di creare gli oggetti specifici.
Esempio 2 - Switch Case
Una versione semplificata è quella in cui non ho factory figlie della factory astratta principale ma è tutto racchiuso un un metodo e la decisione se istanziare la classe A o B è all’interno di uno switch case. Un esempio banale è il seguente:
Client
Il client chiamerà la factory e in base al parametro in ingresso verrà fornita una istanza o l’altra.
Rider Live template
Allego il live template per utilizzare questo pattern in Rider o Visual Studio con Resharper.
Transclude of Factory-Rider-live-template.txt