public class LegacyPizza {
String name;
Dough dough;
Sauce sauce;
Cheese cheese;
public void prepare(String pizzaStoreName) {
DoughFactory doughFactory = new DoughFactory();
SauceFactory sauceFactory = new SauceFactory();
CheeseFactory cheeseFactory = new CheeseFactory();
dough = doughFactory.selectDough(pizzaStoreName);
sauce = sauceFactory.selectSauce(pizzaStoreName);
cheese = cheeseFactory.selectCheese(pizzaStoreName);
}
}
//store가 많이 질수록 팩토리 객체를 생성하는 부분이 더욱 길어지는 문제 발생.
public class DoughFactory {
public DoughFactory() {}
public Dough selectDough(String pizzaStoreName) {
if (pizzaStoreName.equals("store1")) {
return new ThinCrustDough();
} else if (pizzaStoreName.equals("store2")) {
return new ThickCrustDough();
} else {
System.out.println("error: Invalid Store");
}
return null;
}
}
public class SauceFactory{
public SauceFactory() {}
public Sauce selectSauce(String pizzaStoreName) {
if (pizzaStoreName.equals("store1")) {
return new MarinaraSauce();
} else if (pizzaStoreName.equals("store2")) {
return new TomatoSauce();
} else {
System.out.println("error: Invalid Store");
}
return null;
}
}
public class CheeseFactory{
public CheeseFactory() {}
public Cheese selectCheese(String pizzaStoreName) {
if (pizzaStoreName.equals("store1")) {
return new RegianoCheese();
} else if (pizzaStoreName.equals("store2")) {
return new ChedaCheese();
} else {
System.out.println("error: Invalid Store");
}
return null;
}
}
public interface PizzaIngredientFactory {
Dough createDough();
Sauce createSauce();
Cheese createCheese();
}
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
@Override
public Dough createDough() {
return new ThinCrustDough();
}
@Override
public Sauce createSauce() {
return new MarinaraSauce();
}
@Override
public Cheese createCheese() {
return new RegianoCheese();
}
}
public abstract class Dough {
String name;
String type;
@Override
public String toString() {
return "Cheese{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
public class ThinCrustDough extends Dough{
public ThinCrustDough() {
name = "ThinCrustDough";
type = "ThinCrust";
}
}
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Cheese cheese;
public abstract void prepare();
public void bake() {
System.out.println("Bake for 25 minutes at 350");
}
public void cut() {
System.out.println("Cutting the pizza into 8 slices");
}
public void box() {
System.out.println("Place pizza in official PizzaStore box");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Pizza{" +
"name='" + name + '\'' +
", dough=" + dough +
", sauce=" + sauce +
", cheese=" + cheese +
'}';
}
}
public class CheesePizza extends Pizza{
PizzaIngredientFactory pizzaIngredientFactory;
public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory) {
this.pizzaIngredientFactory = pizzaIngredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing " + name);
super.dough = pizzaIngredientFactory.createDough();
super.sauce = pizzaIngredientFactory.createSauce();
super.cheese = pizzaIngredientFactory.createCheese();
}
}
public abstract class PizzaStore {
protected abstract Pizza createPizza(String type);
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
public class NYPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
if (type.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");
} else if (type.equals("peppernoni")) {
pizza = new PepperoniPizza(ingredientFactory);
pizza.setName("New York Style Pepperoni Pizza");
} else {
return null;
}
return pizza;
}
}
TEST CODE
public class PizzaCreateTest {
public static void main(String[] args) {
PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();
pizzaIngredientFactory.createDough();
pizzaIngredientFactory.createCheese();
pizzaIngredientFactory.createSauce();
PizzaStore NYPizzaStore = new NYPizzaStore();
Pizza pizza = NYPizzaStore.orderPizza("cheese");
System.out.println("order success: " + pizza1.toString() + "\n");
}
}