책너두 (헤드 퍼스트 디자인 패턴) 13일차 (~189p)

요약

  • 객체지향 빵 굽기 : 팩토리 패턴
    • 원재료 팩토리 만들기
    • 뉴욕 원재료 팩토리 만들기
    • Pizza 클래스 변경하기
    • 바뀐 내용 되돌아보기
      • 새로운 코드로 또 피자 주문하기
      • New! 피자가 만들어지기까지

메모

원재료 팩토리 만들기

public interface PizzaIngredientFactory {
    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
    public Veggies[] createVeggies();
    public Pepperoni createPepperoni();
    public Clams createClam();
}
  • 원재료별 생성 메소드를 정의함.

뉴욕 원재료 팩토리 만들기

public class NYPizzaIngredientFactory implements PizzaIngredientFactory
    public Dough createDough() {
        return new ThinCrustDough();
    }

    public Sauce createSauce() {
        return new MarinaraSauce();    
    }

    public Cheese createCheese() {
        return new ReggianoCheese();
    }

    public Veggies[] createVeggies() {
        Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(),
        return veggies;
    }

    public Pepperoni createPepperoni() {
        return new SlicedPepperoni();
    }

    public Clams createClam() {
        return new FreshClams();
    }
}
  • 각 재료 군에 들어있는 재료를 뉴욕 지점에 알맞게 만듦.

Pizza 클래스 변경하기

public abstract class Pizza {
    String name;
    Dough dough;
    Sauce sauce;
    Veggies veggies[];
    Cheese cheese;
    Pepperoni pepperoni;
    Clams clam;

    abstract void prepare();

    void bake() {
        System.out.println("175도에서 25분 간 굽기");
    }

    void cut() {
        System.out.println("피자를 사선으로 자르기");
    }

    void box() {
        System.out.println("상자에 피자 담기");
    }

    void setName(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }

    public String toString() {
        // 피자 이름을 출력하는 부분
    }
}
  • Pizza 클래스가 팩토리에서 생산한 원재료만 사용하도록 코드를 고침
    • prepare 메소드를 추상 메소드로 만듦.
    • 피자를 만드는 데 필요한 재료를 가져옴.
    • 원재료는 원재료 팩토리에서 가져옴.
      • 특정 지점에서 싸구려 재료를 사용하는 것에 대한 고민을 할 필요가 없어짐.
  • 앞서 팩토리 메소드 패턴에서 NYCheesePizza, ChicagoCheesePizza 클래스를 만들었음.
    • 지역별로 다른 재료를 사용하는 것 빼고는 똑같음.
    • 따라서, 피자마다 클래스를 지역별로 따로 만들 필요가 없음.
    • 지역별로 다른 점은 원재료 팩토리에서 처리하면 됨.
public class CheesePizza extends Pizza {
    PizzaIngredientFactory ingredientFactory;

    public Cheesepizza(PizzaIngredientFactory ingredientFactory) {
        this.ingredientFactory = ingredientFactory;
    }

    void prepare() {
        System.out.println(" :" + name);
        dough = ingredientFactory.createDough();
        sauce = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
    }
}
  • CheesePizza 를 만들기 위해, 원재료를 제공하는 팩토리가 필요함.
    • 팩토리를 인스턴스 변수에 저장함.
    • 지역에 따라 다른 원재료를 제공함.

바뀐 내용 되돌아보기

  • 추상 팩토리라고 부르는 새로운 형식의 팩토리를 도입해서 피자 종류에 맞는 원재료군을 생산함.
    • 제품을 생산하는 팩토리를 분리할 수 있음.

새로운 코드로 또 피자 주문하기

  • 뉴욕 스타일 피자와 시카고 스타일 피자를 주문한다.

New! 피자가 만들어지기까지

1. 주문 첫 단계는 전혀 바뀌지 않음. 뉴욕 피자 가게가 필요함.

PizzaStore nyPizzaStore = new NYPizzaStore();

2. 주문함.

nyPizzaStore.orderPizza("cheese");

3. orderPizza() 메소드는 일단 createPizza() 메소드를 호출함.

Pizza pizza = createPizza("cheese");

4. 원재료 팩토리를 사용함.

Pizza pizza = new CheesePizza(nyIngredientFactory);

5. 피자를 준비함.

void prepare() {
    dough = factory.createDough();
    sauce = factory.createSauce();
    cheese = factory.createCheese();
}
  • 뉴욕 원재료 팩토리를 넣었기에, 뉴욕 스타일 재료가 쓰임.

댓글

Designed by JB FACTORY