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

요약

  • 객체지향 빵 굽기 : 팩토리 패턴
    • 최첨단 피자 코드 만들기
    • 객체 생성 부분 캡슐화하기
    • 객체 생성 팩토리 만들기
    • 클라이언트 코드 수정하기
    • ‘간단한 팩토리’의 정의

메모

CHAPTER 04. 객체지향 빵 굽기 : 팩토리 패턴

  • new 연산자는 구상 클래스의 인스턴스를 생성함.
    • 인터페이스가 아닌 특정 구현을 사용하는 것임.
    • 만약 다형성을 이용하여, 실행 시에 동적으로 인스턴스 형식을 조건에 따라 구상 클래스를 다르게 생성하고 싶다면, 특정 if 문을 사용해야 함.
      • 변경하거나 확장해야할 때 코드 변경이 불가피함.

최첨단 피자 코드 만들기

Pizza orderPizza(String type) {
    Pizza pizza;

    if (type.equals("cheese")) {
        pizza = new CheesePizza();
    } else if (type.equals("greek") {
        pizza = new GreekPizza();
    } else if (type.equals("pepperoni") {
        pizza = new PepperoniPizza();
    }

    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
}
  • 피자 종류는 여러개 있을 수 있음.
    • 올바른 피자 종류를 고르고, 그에 맞는 피자를 만드는 코드가 있어야 함.
    • 만약, 잘 팔리지 않는 greek 피자를 제거하고, 새로운 Clam, Veggie 피자를 추가한다면?
    • 피자 만드는 코드의 수정이 필요함.
      • 캡슐화가 필요함.

객체 생성 부분 캡슐화하기

if (type.equals("cheese")) {
    pizza = new CheesePizza();
} else if (type.equals("greek") {
    pizza = new GreekPizza();
} else if (type.equals("pepperoni") {
    pizza = new PepperoniPizza();
}
  • 위와 같이 객체를 생성하는 코드만 따로 빼서 피자 객체를 만드는 일만 전담하는 개체에 넣는다.
  • 새로 만들 객체 이름은 팩토리 라고 부른다.

객체 생성 팩토리 만들기

public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;

        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni") {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
    }
}
  • 피자 객체 생성 부분을 전담하는 클래스를 정의함.

클라이언트 코드 수정하기

public class PizzaStore {
    SimplePizzaFactory factory;

    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }

    public Pizza orderPizza(String type) {
        Pizza pizza;

        pizza = factory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}
  • 클라이언트 코드는 더이상 구상 클래스 인스턴스를 만들 필요가 없음.

‘간단한 팩토리’의 정의

  • 위와 같은 ‘간단한 팩토리’는 디자인 패턴이라기 보다 프로그래밍에서 자주 쓰이는 관용구에 가까움.
    • 진짜 팩토리 패턴 2가지는 추후 나옴.

댓글

Designed by JB FACTORY