팩토리 패턴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).

좋은 웹페이지 즐겨찾기