요약
- 객체지향 빵 굽기 : 팩토리 패턴
- 최첨단 피자 코드 만들기
- 객체 생성 부분 캡슐화하기
- 객체 생성 팩토리 만들기
- 클라이언트 코드 수정하기
- ‘간단한 팩토리’의 정의
메모
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;
}
}
- 클라이언트 코드는 더이상 구상 클래스 인스턴스를 만들 필요가 없음.
‘간단한 팩토리’의 정의
- 위와 같은 ‘간단한 팩토리’는 디자인 패턴이라기 보다 프로그래밍에서 자주 쓰이는 관용구에 가까움.