팩토리 메소드 패턴 - 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하게 만든다. 팩토리 메서드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브 클래스에게 맡긴다.
public class DependentPizzaStore {
public Pizza createPizza(String style, String type) {
Pizza pizza = null;
if(style.equals("NY")) {
if(type.equals("cheese")){
pizza = new NYStyleCheesePizza();
} else if(type.equals("veggie")) {
pizza = new NyStyleVeggiePizza();
}
} else if(style.equals("Chicago")) {
if(type.equals("cheese")) {
pizza = new ChicagoStyleCheesePizza();
} else if(type.equals("veggie")) {
pizza = new ChicagoStyleVeggiePizza();
}
}
pizza.prepare();
pizza.bake();
pizza.cur();
pizza.box();
return pizza;
}
}
public abstract class PizzaStroe {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepre();
pizza.bake();
pizza.cur();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type); //피자를 만드는 일은 팩토리 역할을 하는 메소드에서 맡아서 처리
}
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if(item.equals("cheese")){
return pizza = new NYStyleCheesePizza();
} else if(item.equals("veggie")) {
return pizza = new NyStyleVeggiePizza();
}
}
}
}
// 시카고 지점 이하 동문
public class PizzaTestDrive {
public static void main(String[] args) {
PizzaStroe nyStore = new NYPizzaStroe();
pizzaStroe chicagoStore = new ChicagoPizzaStore();
Pizza NYPizza = nyStore.orderPizza("cheese"); //뉴욕 치즈 스타일 피자 반환
Pizza ChicagoPizza = chicagoStore.orderPizza("cheese"); //시카고 치즈 스타일 피자 반환
}
}
추상 팩토리 패턴 - 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
pulbic interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
}
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
public Dough createDough() {
return new ThinCrustDough();
}
public Sauce createSauce() {
return new MarinaraSauce();
}
public Cheese createCheese() {
return new ReggianoCheese();
}
}
public abstract class Pizza {
String name;
Dough dough;
Sauce sause
abstract void prepare();
}
public class CheesePizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory();
}
void prepare() {
dough = ingredientFactory.createDough();
sause = ingredientFactory.createSause();
cheese = ingredientFactory.createCheese();
}
}
출처