public interface Pizza {
void addTopping();
void bake();
}
public class CheesePizza implements Pizza {
@Override
public void addTopping() {
System.out.println("Add Cheese Topping!");
}
@Override
public void bake() {
System.out.println("Baking cheese Pizza");
}
}
public class PeperoniPizza implements Pizza {
@Override
public void addTopping() {
System.out.println("Add Peperoni topping !");
}
@Override
public void bake() {
System.out.println("Baking peperoni Pizza");
}
}
public class PizzaStore {
private SimplePizzaFactory simplePizzaFactory;
public PizzaStore(SimplePizzaFactory simplePizzaFactory) {
this.simplePizzaFactory = simplePizzaFactory;
}
public void orderPizza(PizzaType pizzaType) {
Pizza pizza = simplePizzaFactory.createPizza(pizzaType);
pizza.addTopping();
pizza.bake();
}
}
public class PizzaFactory {
public Pizza createPizza(PizzaType pizzaType) {
if (pizzaType == PizzaType.CHEESE) {
return new CheesePizza();
} else if (pizzaType == PizzaType.PEPERONI) {
return new PeperoniPizza();
} else {
System.out.println("Pizza type not existed");
throw new RuntimeException();
}
}
}
public class Client {
public static void main(String[] args) {
PizzaStore pizzaStore = new PizzaStore(new SimplePizzaFactory());
pizzaStore.orderPizza(PizzaType.PEPERONI);
pizzaStore.orderPizza(PizzaType.CHEESE);
}
}
Add Peperoni topping !
Baking peperoni Pizza
Add Cheese Topping!
Baking cheese Pizza
자 이제, 제대로 된 팩토리 메서드 패턴을 만들어보자.
팩토리 메서드 패턴은 Template Method Pattern의 Creator 버전이라고 생각하면 좋다고 위키에 나와있다. (이거보고 사실 좀 이해가 된 거였음)
위에서 작성했던 PizzaStore는 concretFactory이다. 책에서 나온대로 abstract class로 바꿔보자
public abstract class PizzaStore {
public void orderPizza(PizzaType pizzaType) {
Pizza pizza = createPizza(pizzaType);
pizza.addTopping();
pizza.bake();
}
abstract Pizza createPizza(PizzaType pizzaType);
}
public class SeoulPizzaStore extends PizzaStore {
@Override
Pizza createPizza(PizzaType pizzaType) {
if (pizzaType == PizzaType.PEPERONI) {
return new SeoulPeperoniPizza();
} else if (pizzaType == PizzaType.CHEESE) {
return new SeoulCheesePizza();
}
}
}
... NewYorkPizzaStore는 생략..
public class Client {
public static void main(String[] args) {
PizzaStore seoulPizzaStore = new SeoulPizzaStore();
PizzaStore newYorkPizzaStore = new NewYorkPizzaStore();
seoulPizzaStore.orderPizza(PizzaType.PEPERONI);
newYorkPizzaStore.orderPizza(PizzaType.PEPERONI);
seoulPizzaStore.orderPizza(PizzaType.CHEESE);
newYorkPizzaStore.orderPizza(PizzaType.CHEESE);
}
}