Il Factory Pattern è un pattern creazionale che ha l'obiettivo di semplificare la creazione di oggetti in situazioni in cui abbiamo un'alta varietà di impostazioni iniziali oppure quando l'istanza di oggetto da creare dipende dal contesto in cui ci troviamo.
Proviamo ad introdurre il pattern con un esempio, immaginando di dover consentire la creazione di veicoli con caratteristiche specificate al momento della creazione. Il seguente codice mostra come può essere risolto il problema sfruttando il Factory Pattern
:
var veicoloFactory = {
creaVeicolo: function(opzioni) {
var veicolo;
if (opzioni && opzioni.length) {
switch (opzioni.tipo) {
case "auto":
veicolo = new Automobile(opzioni);
break;
case "moto":
veicolo = new Moto(opzioni);
break;
case "camion":
veicolo = new Camion(opzioni);
break;
}
}
};
};
Abbiamo definito un oggetto veicoloFactory
che mette a disposizione il metodo creaVeicolo()
il cui compito è la creazione di un oggetto-veicolo con le caratteristiche specificate nelle opzioni. In particolare, l'opzione tipo
determina il tipo di veicolo che vogliamo ottenere e fa in modo che all'interno del Factory
venga invocato un costruttore diverso.
Un esempio d'uso del metodo creaVeicolo()
è mostrato di seguito:
var myAutomobile = veicoloFactory.creaVeicolo({tipo: "auto", colore: "rosso", modello: "berlina"});
Dall'esterno dell'oggetto Factory
non si ha idea del modo in cui viene generato l'oggetto richiesto. Questo fa sì che l'eventuale aggiunta della possibilità di creare un nuovo tipo di veicolo, ad esempio un autobus, non richieda l'utilizzo di un nuovo metodo, ma riutilizza lo stesso metodo creaVeicolo()
con la possibilità di specificare un nuovo tipo:
var myAutobus = veicoloFactory.creaVeicolo({tipo: "bus", colore: "giallo"});