So che ci sono centinaia di domande su questo qui. Probabilmente ho letto cinquanta diverse domande, post di blog e libri di testo. Il problema è che ho ottenuto circa 75 risposte diverse. Ho visto tutto quanto segue descritto come un tipo di fabbrica, e non posso seguire la terminologia confusa, e confondermi con i pro ei contro.
public class PizzaFactory {
public static Pizza(String city) {
switch(city) {
case "Chicago": return new DeepDishPizza();
case "New York": return new ThinCrustPizza();
}
}
}
vs
public abstract class PizzaFactory {
public Pizza getPizza();
}
public class ChicagoPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new DeepDishPizza();
}
}
public class NewYorkPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new ThinCrustPizza();
}
}
public class SomeOtherClass {
public Pizza getPizza(String city) {
PizzaFactory pizzaShop;
switch(city) {
case "Chicago": pizzaShop = new ChicagoPizzaShop();
break;
case "New York" : pizzaShop = new NewYorkPizzaShop();
break;
return pizzaShop.getPizza();
}
}
}
vs
public class PizzaFactoryFactory {
public abstract class PizzaFactory {
public Pizza getPizza();
}
public class ChicagoPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new DeepDishPizza();
}
}
public class NewYorkPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new ThinCrustPizza();
}
}
public Pizza getPizza(String city) {
switch (city) {
case "Chicago": return new ChicagoPizzaShop().getPizza();
case "New York": return new NewYorkPizzaShop().getPizza();
}
}
}
vs
public abstract class PizzaFactory {
public Pizza getPizza();
}
public class ChicagoPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new DeepDishPizza();
}
}
public class NewYorkPizzaShop extends PizzaFactory {
public Pizza getPizza() {
return new ThinCrustPizza();
}
}
}
public abstract Customer {
public Pizza orderPizza();
}
public ChicagoCustomer extends Customer {
public Pizza orderPizza() {
return new ChicagoPizzaShop.getPizza();
}
}
public NewYorkCustomer extends Customer {
public Pizza orderPizza() {
return new NewYorkPizzaShop.getPizza();
}
}
// How does one choose which Customer to use? *Another* factory?
Ci sono probabilmente altri a cui non sto pensando in questo momento. Quale di questi è uno schema di fabbrica astratta? Il modello del metodo di fabbrica? Qualche altra cosa? Più concretamente, ho otto sottoclassi diverse di una classe astratta, e ho bisogno di restituire una di quelle basate su una selezione utente che posso rappresentare sia come stringa, sia come int o enum. Come fare meglio?