팩토리 패턴2
추상화 팩토리 패턴
서로 연관되거나 의존적인 객체들의 인터페이스를 제공하는 기법이다.
이전에 작성한 클래스들을 보면
2개의 추상클래스 pizza, pizzaStore가 있고
그 아래에 각 피자들과 pizzaStore분점들이 존재했다.
어떤 지점이던 pizza를 만들때, dough, cheese같은 재료들은 중복해서 들어가게 된다.
따라서 각 재료들을 만드는 PizzaIngredientFactory를 만들고, 그 인터페이스를 받아 각 피자스타일별로 공장을 구현하면 되는것이다.
public interface PizzaIngredientFactory {
public Dough createDough(); // 각 재료별 클래스가 추가되었다.
public Sauce createSauce();
public Cheese createCheese();
public Pepperoni createPepperoni();
}
이 인터페이스를 받은 NYPizzaIngredient Factory이다.
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
public Dough createDough() {
return new ThinCrustDough();
}
public Sauce createSauce() {
return new MarinaraSauce();
}
public Cheese createCheese() {
return new ReggianoCheese();
}
public Pepperoni createPepperoni() {
return new SlicePepperoni();
}
public Clams createClam() {
return new FreshClams();
}
}
public class NYPizzaStore extends PizzaStore {
protected Pizza createPizza(String item) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
if (item.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");
} else if (item.equals("clam")) {
pizza = new ClamPizza(ingredientFactory);
pizza.setName("New York Style Clam Pizza");
} else if (item.equals("pepperoni")) {
pizza = new PepperoniPizza(ingredientFactory);
pizza.setName("New York Style Pepperoni Pizza");
}
return pizza;
}
}
이를 받아서 피자를 만드는 NYPizzaStore의 클래스이다.
NYPizzaIngredientFactory를 받아서, 여기서 재료를 만들어다가 쓰는 방식이다.
public class CheesePizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
void prepare() {
System.out.println("Preparing " + name);
dough = ingredientFactory.createDough();
sauce = ingredientFactory.createSauce();
cheese = ingredientFactory.createCheese();
}
}
최종적으로 피자가 결정되었으면, 선택된 피자에서는 생성자를 통해 ingredientFactory를 받고, create 메소드를 통해 각 재료들을 만들게된다.
장점과 단점
이렇나 패턴을 쓰면 구현클래스에 대한 의존을 줄이고 추상화를 하는 DIP가 잘 지켜지게 된다. 하지만 인터페이스도 만들고 새 객체도 만들고 고쳐야 할 부분이 많다.
결론
심플팩토리, 팩토리메소드, 추상화 팩토리 모두 결론적으로 결합을 느슨하게 하고 변화하는 부분의 캡슐화를 통해 변경을 용의하게 하고 (OCP) 의존성을 줄이는 관점에서 의미가 있다(DIP).
Author And Source
이 문제에 관하여(팩토리 패턴2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@blacklandbird/팩토리-패턴2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)