Sto leggendo il libro » Head First Design Patterns « di O'Reilly. Prima di spiegare il modello di metodo di fabbrica, introducono prima una fabbrica semplice.
Stanno usando l'esempio di una pizzeria. In un primo passaggio mostrano il problema:
Pizza orderPizza(string type) {
Pizza pizza;
if (type.equals("Pepperoni") { pizza = new PepperoniPizza(); }
else if (type.equals("Salmon") { pizza = new SalmonPizza(); }
// ... and so on
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Pack();
return pizza;
}
Il problema ovvio è che devi cambiare Pizzeria ogni volta che aggiungi o rimuovi una pizza.
Quindi introducono prima un "Simple Factory Idiom". Sposta la parte di creazione in una classe "SimplePizzaFactory". Ora non devi più modificare Pizzeria quando aggiungi o rimuovi una pizza.
Quindi dicono che questo approccio non è buono, quando hai più di una pizzeria (in diverse città).
Non capisco davvero il loro ragionamento. Forniscono il seguente codice di esempio e quindi dicono che ogni pizzeria non sta utilizzando la procedura come implementata in precedenza ma utilizzava metodi diversi per "cuocere", "tagliare" e "impacchettare" la pizza.
BerlinPizzaFactory berlinFactory = new BerlinPizzaFactory();
Pizzeria berlinPizzeria = new Pizzeria(berlinFactory);
berlinPizza.Order("Pepperoni");
Invece di usare la Fabbrica semplice, suggeriscono di utilizzare il modello di metodo di fabbrica.
Per prima cosa, non vedo perché la BerlinPizzeria dovrebbe non usare la procedura. È sempre una pizzeria e quando chiami Order, stai utilizzando la stessa procedura.
La mia ipotesi migliore è che stanno insinuando che sei in grado di implementare, diciamo, una caffetteria (sto deliberatamente usando qualcosa di completamente diverso per esprimere il mio punto di vista) e utilizzare la fabbrica (dato che è indipendente dalla pizzeria) e prepara la pizza nel modo che preferisci.
Ma anche quando si utilizza il modello di metodo di fabbrica, nessuno ti obbliga a utilizzare la procedura predefinita. È ancora più semplice "nascondere" che lo stai facendo in modo diverso. I loro esempi di codice sono forniti in Java e i metodi Java sono virtuali per impostazione predefinita. Quindi sarei in grado di implementare BerlinPizzeria e sovrascrivere l'ordine (o dover dichiarare esplicitamente il metodo come finale). Il cliente, tuttavia, non si accorgerebbe che la mia BerlinPizzeria sta facendo le cose in modo diverso.
In conclusione, non vedo alcuna differenza significativa tra una fabbrica semplice e il modello di metodo di fabbrica. L'unico vantaggio del modello di metodo di fabbrica che sto vedendo è che si salverebbero alcune classi (vale a dire le fabbriche "in outsourcing").
Quindi, quali sono realmente gli svantaggi di una Simple Factory e perché non è una buona idea quella di "esternalizzare" la parte creatrice?
O qual è davvero il vantaggio del pattern Metodo di fabbrica e perché è una buona idea forzare la parte di creazione che viene implementata nella sottoclasse?