책너두 (헤드 퍼스트 디자인 패턴) 13일차 (~189p)
- Book/헤드 퍼스트 디자인 패턴
- 2023. 7. 11.
요약
- 객체지향 빵 굽기 : 팩토리 패턴
- 원재료 팩토리 만들기
- 뉴욕 원재료 팩토리 만들기
- 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();
}
- 뉴욕 원재료 팩토리를 넣었기에, 뉴욕 스타일 재료가 쓰임.
'Book > 헤드 퍼스트 디자인 패턴' 카테고리의 다른 글
책너두 (헤드 퍼스트 디자인 패턴) 15일차 (~216p) (0) | 2023.07.13 |
---|---|
책너두 (헤드 퍼스트 디자인 패턴) 14일차 (~204p) (0) | 2023.07.12 |
책너두 (헤드 퍼스트 디자인 패턴) 12일차 (~179p) (0) | 2023.07.10 |
책너두 (헤드 퍼스트 디자인 패턴) 11일차 (~165p) (0) | 2023.07.10 |
책너두 (헤드 퍼스트 디자인 패턴) 10일차 (~152p) (0) | 2023.07.08 |