- 객체를 생성하기 위해 인터페이스를 만듭니다. 어떤 클래스의 인스턴스를 만들지를 서브클래스에서 결정하도록 합니다.
- 팩토리 메소드를 이용하면 인스턴스를 만드는 일을 서브클래스로 미룰 수 있습니다.
- 생성할 객체의 클래스를 국한하지 않고 객체를 생성
1) 먼저 Creator 클래스인 PizzaStore
를 만든다.
2) 이 클래스는 createPizza
라는 팩토리 메소드를 실행해서 pizza를 생성한다.
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);
}
createPizza 팩토리 메소드
를 오버라이딩한다.//NYPizzaStore.class
public class NYPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String item) {
if ("cheese".equals(item)) {
return new NYStyleCheesePizza();
} else if ("veggie".equals(item)) {
return new NYStyleVeggiePizza();
} else if ("clam".equals(item)) {
return new NYStyleClamPizza();
} else {
return null;
}
}
}
//ChicagoPizzaStore.class
public class ChicagoPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String item) {
if ("cheese".equals(item)) {
return new ChicagoStyleCheesePizza();
} else if ("veggie".equals(item)) {
return new ChicagoStyleVeggiePizza();
} else if ("clam".equals(item)) {
return new ChicagoStyleClamPizza();
} else {
return null;
}
}
}
public abstract class Pizza {
String name;
String dough;
String sauce;
void prepare() {
System.out.println("preparing~~ " + name);
}
void bake() {
System.out.println("baking~~");
}
void box() {
System.out.println("boxing~~");
}
public String getName() {
return name;
}
}
Product 클래스
인 Pizza
를 확장하여 3가지의 시카고 스타일 피자를 만들었다.
//1. 치즈피자
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
name = "ChicagoStyleCheesePizza";
}
}
//2. clam 피자
public class ChicagoStyleClamPizza extends Pizza {
public ChicagoStyleClamPizza() {
name = "ChicagoStyleClamPizza";
}
}
//3. Veggie피자
public class ChicagoStyleVeggiePizza extends Pizza {
public ChicagoStyleVeggiePizza() {
name = "ChicagoStyleVeggiePizza";
}
}
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza nyCheesePizza = nyStore.orderPizza("cheese");
Pizza nyClamPizza = nyStore.orderPizza("clam");
Pizza chicagoCheesePizza = chicagoStore.orderPizza("cheese");
Pizza chicagoClamPizza = chicagoStore.orderPizza("clam");
preparing~~ NYStyleCheesePizza
baking~~
boxing~~
preparing~~ NYStyleClamPizza
baking~~
boxing~~
preparing~~ ChicagoStyleCheesePizza
baking~~
boxing~~
preparing~~ ChicagoStyleClamPizza
baking~~
boxing~~
지점과 주어진 타입(cheeze, clam)에 따라서 다른 피자를 만드는 것을 확인할 수 있다.