런타임노트

[헤드퍼스트 디자인패턴] 11일차. 153-165pg 본문

책책책 책을 읽읍시다‼ ver.개발/[ 헤드퍼스트 디자인패턴 ]

[헤드퍼스트 디자인패턴] 11일차. 153-165pg

D269 2023. 5. 8. 10:15
728x90

 

11일차

헤드퍼스트 디자인패턴 [금요일]

153-165pg

요약

CHAPTER 04. 객체지향 빵 굽기 (feat. 팩토리 패턴)

[ 다양한 팩토리 만들기 - 피자 프랜차이즈 사업 시작 ]

피자가게 지점내기.

PizzaStrore 코드를 모든 지점에서 활용한다.

⁉ 문제발생 : 굽는방식이나 자르는 것이 사라지거나 하는 문제 발생

해결 : PizzaStore와 피자 제작코드 전체를 하나로 묶어주는 프레임워크 만들기. + 유연성 잃으면 안됨.

 

[ 피자가게 프레임워크 만들기 ]

각 지점마다 달라지는 것은 ‘피자 스타일’ 뿐.

달라지는 점을 createPizza()에 넣는다.

 

Pizza는 추상 클래스라서 orderPizza()는 실제로 어떤 구상 클래스에서 작업이 처리되고 있는지 전혀 알 수 없다.

→ PizzaStore와 Pizza는 서로 완전히 분리되어 있다.

 

orderPizza() -호출→ createPizza() -받음→ Pizza의 서브클래스

서브클래스에서 피자 종류를 실시간으로 결정하는 것이 아니라, 피자 종류는 어떤 서브클래스를 선택했느냐에 따라 결정된다.

 

[ 팩토리 메소드 선언하기 ]

  1. 팩토리 메소드를 추상 메소드로 선언해서 서브클래스가 객체 생성을 책임지도록 합니다.
  2. 팩토리 메소드는 특정 객체를 리턴하며, 그 객체는 보통 슈퍼클래스가 정의한 메소드 내에서 쓰입니다.
  3. 팩토리 메소드는 클라이언트(슈퍼클래스에 있는 orderPizza())같은 코드에서 실제로 생성되는 구상 객체가 무엇인지 알 수 없게 만드는 역할도 합니다.

 

모든 팩토리 패턴은 객체 생성을 캡슐화한다.

팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화한다.

  • 생산자(Creator) 클래스
    • PizzaStore, NYPizzaStore, ChicagoPizzaStore
  • 제품(Product) 클래스
    • Pizza의 종류 : 뉴욕스타일치즈피자, 시카고 스타일치즈 피자 등등

 

발췌

💡 서브클래스에서 피자 종류를 실시간으로 결정하는 것이 아니라, 피자 종류는 어떤 서브클래스를 선택했느냐에 따라 결정된다.
💡 팩토리 메소드는 객체 생성을 서브클래스에 캡슐화할 수 있습니다. 그러면 슈퍼클래스에 있는 클라이언트 코드와 서브 클래스에 있는 객체 생성 코드를 분리할 수 있습니다.

 

 

숙제

158p ChicagoPizzaStroe, CaliforniaPizzaStrore 지점 만들기

public class ChicagoPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
		if(item.equals("chees")) {
			return new ChicagoCheesePizza();
		} else if(item.equals("veggie")) {
			return new ChicagoVeggiePizza();
		} else if(item.equals("clam")) {
			return new ChicagoClamPizza();
		} else if(item.equals("pepperoni")) {
			return new ChicagoPepperoniPizza();
		} else return null;

	}
}

public class CaliforniaPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
		if(item.equals("chees")) {
			return new CaliforniaCheesePizza();
		} else if(item.equals("veggie")) {
			return new CaliforniaVeggiePizza();
		} else if(item.equals("clam")) {
			return new CaliforniaClamPizza();
		} else if(item.equals("pepperoni")) {
			return new CaliforniaPepperoniPizza();
		} else return null;

	}
}
728x90
반응형