Sto leggendo sul modello di progettazione "metodo di fabbrica" da "Head First Design Patterns". Quindi, c'è una classe
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
Come puoi vedere sopra, memorizziamo factory e quindi chiamiamo createPizza(String)
virtual function e chiameremo la funzione createPizza(...)
appropriata per la classe factory concrete, ad esempio NYStylePizzaFactory
o ChicagoStylePizzaFactory
.
Ma poi l'autore continua:
But you’d like a little more quality control...!
e apporta le seguenti modifiche al codice:
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza();
}
public class NYStylePizzaStore : PizzaStore {
Pizza createPizza() {
return new NYStylePizza();
}
}
public class ChicagoStylePizzaStore : PizzaStore {
Pizza createPizza() {
return new ChicagoStylePizza();
}
}
Quindi, non capisco perché otteniamo più controllo di qualità in quest'ultimo caso? Sembra che il risultato sia lo stesso: viene chiamata la funzione virtuale appropriata.