design pattern study 4 factory pattern _ by dragor0123
TRANSCRIPT
• 본 PPT는 Design Patterns Study를 위해 작성되었습니다.
• Study에 사용한 교재는 한빛미디어에서 나온
• [Head First Desgin Patterns]을 사용하였습니다.
• Written by 서울시립대 이희태 For study withNHN NEXT2기 조현호서 울 시 립 대 이 희 태
라면 만드는 부분을 캡슐화하면 어떨까?
SimpleRamyunFactory
라면 객체 생성 코드 부분만 따로 빼서주문(orderRamyun)과제작(createRamyun)을분리해보자!
SimpleFactory 구조
createRamyun()
SimpleRamyunFactory
orderRamyun()
RamyunStore
CheeseRamyun
prepare()boil()putIntoBowl()
Ramyun
SpicyRamyun
SausageRamyun
SquidRamyun
팩토리를 사용하는client
Static메소드로 선언하는 경우 많음
구체적인 라면 객체를 생성하는 factory
팩토리에서 만들 상품(추상클래스)
팩토리에서 생산하는구체적인 상품들(구체적인 라면)
Has-A관계
Is-A관계
Factory Method의 필요성
기존 RamyunStore의 프레임을 그대로 유지하면서 각 프랜차이즈의 다양한 라면을 만드는 방법은 없을까요?
type이 cheese일때 상황에 따라NScheese라면/ Ottugcheese라면유연하게 변할 수 있어야…
orderRamyun()의 프레임인create->prepare->boil->putIntoBowl의 과정은 그대로 유지해야…
Factory Method
createRamyun에서 실제 생성되는객체가 무엇인지 모르게 할 것.
추상메소드로 선언, subclass에서 객체생성
매개 변수를 통해 만들 객체의 종류 선택
Concrete RamyunStore
< 라면이 만들어지는 과정 >
1. RamyunStore nsRamyunStore = new
NSRamyunStore();
2. nsRamyunStore.orderRamyun(“cheese”);
3. Ramyun ramyun =
createRamyun(“cheese”);
4. ramyun.prepare();
ramyun.boil();
ramyun.putIntoBowl();
병렬 클래스 계층구조
String name;String noodle;String sauce;ArrayList<String> toppings;
Ramyun
NSStyleCheeseRamyun
createRamyun()
NSRamyunStore
createRamyun() ←abstractorderRamyun()…
RamyunStore
NSStyleSausageRamyun
NSStyleSpicyRamyun
OttugStyleCheeseRamyun
OttugStyleSausageRamyun
OttugStyleSpicyRamyuncreateRamyun()
OttugRamyunStore
병렬적 구조
Factory Method Pattern 정의
팩토리 메소드 패턴(Factory Method Pattern)
Def. 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는
데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다. 팩토리메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게맡길 수 있다.
Factory Method Pattern UML
String name;String noodle;String sauce;ArrayList<String> toppings;
void prepare()void boil()Void putIntoBowl()
Ramyun
NSStyleCheeseRamyun
createRamyun() ←abstractorderRamyun()…
RamyunStore
OttugStyleCheeseRamyun
//return new OttugStyleRamyun()createRamyun()
OttugRamyunStore
//return new OttugStyleRamyun()createRamyun()
NSRamyunStore
객체 의존성
RamyunStore
NSStyleCheeseRamyun
NSStyleSausageRamyun
NSStyleSquidRamyun
NSStyleSpicyRamyun
NSStyleRicecakeRamyun
NSStyleCheeseRamyun
NSStyleSausageRamyun
NSStyleSquidRamyun
NSStyleSpicyRamyun
NSStyleRicecakeRamyun
RamyunStore
Ramyun
디자인 원칙 6.
추상화된 것에 의존하도록 만들어라.구상 클래스에 의존하도록 만들지 않도록 한다.
의존성 뒤집기(Dependency Inversion Principle)
>>> Guide Line
1. 어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 않는다.
2. 구상 클래스에서 파생된 클래스를 만들지 않는다.
3. 수퍼클래스에 이미 구현되어 있는 메소드를 Override하지 않는다.않는다.
원재료군(families of Ingredients)을 처리하는 방법?
오 뚝
NS라면가게에서파는 라면이라면
굵은 면발에 맵고 짠 스프에 굵은 대파를사용한다.
Ottug라면가게에서파는 라면이라면 가는 면발에 마일드한 스프에 싱싱한 쪽파를
사용한다.
추상 팩토리에 대한 idea
어떤 라면가게인지와는 상관없이, 라면요리에 원료가 되는 면, 스프, 채소, 달걀 등등을 한번에 처리해주는 공장이 있으면 좋을 텐데……
RamyunStore
CASE 1: ramyunStore == NS CASE 2: ramyunStore == Ottug
Create Ramyun!
소제목 스타일 편집
☞ Abstract Factory(추상 팩토리)
라면클래스에서 원재료 팩토리가 인터페이스와 맞기만 하면 어떤 팩토리를 사용하던 상관 없다. SimpleFactory처럼 팩토리를 사용하되, Abstract 클래스로 만들어서 “다형성”을 활용한다.
Ottug이든 NS이든 상관없이,라면공장이라면 면,스프,채소는 원료를 통해 라면을 생산한다!
Abstract Factory Pattern 정의
추상 팩토리 패턴(Abstract Factroy Pattern)
Def. 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
RamyunIngredientFactory UML
NSStyleIngredientFactory
OttugStyleIngredientFactory
public Noodle createNoodle();public Sauce createSauce();public Egg createEgg();public Veggie createVeggie();public Cheese createCheese();
…
RamyunIngredientFactory
interface class
Thick Noodle
Noodle
Sauce
Cheese
Thin Noodle
Mild OttugSauceHot NS Sauce
Processed Cheese Mozzarella Cheese
CreateRamyun(String item)
NSRamyunStore
CreateRamyun(String item)
OttugRamyunStore
Ramyun