49
Factory Method 13.03.09 권권권

Factory method

Embed Size (px)

Citation preview

Page 1: Factory method

Factory Method

13.03.09권승진

Page 2: Factory method

목차• FactoryMethod 어디에 쓰는가 ?• FactoryMethod 개요

• 사용 사례

Page 3: Factory method

생성과 관련된 패턴• Factory Method• Abstract Factory• Builder• Prototype• Singleton

Page 4: Factory method

생성과 관련된 패턴• Factory Method• Abstract Factory• Builder• Prototype• Singleton

Page 5: Factory method

Factory Method

Page 6: Factory method

어디다 쓰는가 ?

특정 구현이 아닌 인터페이스에 맞춰서 프로그래밍하라 .

Page 7: Factory method

어디다 쓰는가 ?• 하지만 결국 생성하는 어딘가에서는…

• 구체적인 클래스를 언급할 수 밖에 없다 .

Page 8: Factory method

어디다 쓰는가 ?

사용하는 측

MallardDuck DecoyDuck

사용하는 측에서는 생성 시 구체적인 클래스 이름을 언급할 수 밖에 없다 .(new 를 해야 되기 때문… )

Page 9: Factory method

어디다 쓰는가 ?

책에서는 피자 가게를 예로 설명하는데… ..

Page 10: Factory method

어디다 쓰는가 ?

그래서 피자가 먹고 싶…

Page 11: Factory method

어디다 쓰는가 ?• 이 아니고 ,

• 만약 피자 가게클래스를 만든다면 ,

Page 12: Factory method

Factory

피자 클래스를 생성하고 ,

Page 13: Factory method

어디다 쓰는가 ?

재료 준비 , 굽기 , 자르기 , 박싱 등의 처리를 할 것이다 .

Page 14: Factory method

어디다 쓰는가 ?

문제는 이 부분이 피자가추가될 때마다계속 변경이 필요한 부분이라는 것

Page 15: Factory method

어디다 쓰는가 ?• 일단 객체지향 원칙대로 변하는 부분부터 분리

해봅니다 .

Page 16: Factory method

어디다 쓰는가 ?

NY 스타일

CA 스타일

Page 17: Factory method

어디다 쓰는가 ?일단 빼서 추상화 했더니 ,

1. 피자가 추가될 때 , 피자 가게 자체에서 대응하지 않아도 된다 .

2. 피자공장을 바꾸던지 , 피자 공장 자체를 수정하던지 ..

Page 18: Factory method

어디다 쓰는가 ?

사실 이렇게 분리해서 생성 부분을 추상화 시키는 것 자체 만으로도 기본은 한 것인데 ...

Page 19: Factory method

어디다 쓰는가 ?

NY 스타일

CA 스타일

뉴욕 피자 가게에선 피자를 자르지 않고 , 박싱해버린다던지…

뉴욕 피자가게 클래스의 orderPizza

Page 20: Factory method

어디다 쓰는가 ?

NY 스타일

CA 스타일

자르지도 않고 박싱도 안해서 걍 내보낸다던지…

뉴욕 피자가게 클래스의 orderPizza

Page 21: Factory method

어디다 쓰는가 ?

NY 스타일

CA 스타일

사용부 쪽에서 의도하지 않는 대로

Pizza 가 사용될 수 있다 .

Page 22: Factory method

Factory Method

• 피자 가공의 일련의 과정들은 물려주고 싶다 .• 대신 피자를 생성할 때만 , 유연성을 주고 싶다 .

Page 23: Factory method

Factory Method

그럴 때 사용 하는 것이 Factory Method 이다 .

Page 24: Factory method

Factory Method

Page 25: Factory method

Factory Method• 사용 측에선 생성 인터페이스만 오버라이드

받아서 구현해라 .

• 나머진 건드리지 말고 ..

Page 26: Factory method

Factory Method

• 객체를 처리하는 일련의 프레임워크처럼 만들되 , 객체를 생성하는 부분만 추상화 할 수 있다 .

Page 27: Factory method

Factory Method

FactoryMethod 정의객체를 생성하기 위한 인터페이스를 정의하는

데 , 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다 .

Page 28: Factory method

Factory Method

PizzaStore

NYCheese NYPepperoni CACheese CAPepperoni

피자 스토어가 직접 객체를 만들면 , 객체간의 개연성이 이렇게 되는데…

Page 29: Factory method

Factory Method

Pizza

NYCheese NYPepperoni CACheese CAPepperoni

생성을 서브 클래스에 위임하면서브클래스가 생성을 담당하고 ,

스토어는 피자가 뭐든 간에같은 가공작업을 할 수 있다 .

PizzaStore

Page 30: Factory method

Factory Method

Pizza

NYCheese NYPepperoni CACheese CAPepperoni

처음에 만든 , SimpleFactory 도그림을 같다고 볼 수 있으나 ,

가공작업이 중구난방일 수 있다 .

PizzaStore

Page 31: Factory method

Factory Method이 그림은 또한 팩토리 패턴이

객체지향 법칙 중 하나인 의존성 뒤집기 법칙(DIP : Dependency Inversion Principle) 을 준수하기 위한 방법 가운데 하나라는 것을 보여준다 .

Page 32: Factory method

Factory Method

PizzaStore

NYCheese NYPepperoni CACheese CAPepperoni

Pizza 스토어가 일일히 구체적인 피자들을 언급해가면서( 구체적인 피자 이름을 알아야 함을 뜻함 . ) 의존하고 있는 모습에서

Page 33: Factory method

Factory Method

Pizza

NYCheese NYPepperoni CACheese CAPepperoni

PizzaStore 는 구체적인 피자 종류를 몰라도 되고 ( Pizza 클래스만 알면 됨을 뜻함 .)구체적인 피자들 역시 Pizza 라는 이름을 통해 PizzaStore 에 전달된다 .그러면서 화살표 방향이 역전 .이 때문에 inversion 이란 단어가붙음 PizzaStore

Page 34: Factory method

Factory Method 사용 사례• Ogre 의 MovableObject• 이름이 Movable 인만큼 , Node 에 attach 될

수 있는 모든 것을 뜻함 .

• 모델이건 , 카메라건 , 라이트건 , Movable이라는 이름으로 제공되야하고 , 생성은 서브클래스가 해야 함 .

Page 35: Factory method

Factory Method 사용 사례• 객체가 생성된 직후에는 자신의 생산자가

누군지 , 그리고 , 관리해주는 매니저가 누군지 공통적으로 설정해줘야함 .

Page 36: Factory method

Factory Method 사용 사례• createInstanceImpl 는 순수가상함수로

상속 받은 누군가가 구현하도록 한다 .

Page 37: Factory method

Factory Method 사용 사례• 그 상속받은 누군가는 Light 가 될 수도 ,

Page 38: Factory method

Factory Method 사용 사례• 그 상속받은 누군가는 Entity 가 될 수도

(Ogre 에서 모델역활 )

Page 39: Factory method

Factory Method 사용 사례• 구현은 뭐…상속받은 쪽에서 알아서 잘 했을

것이다 .

Page 40: Factory method

Factory Method 사용 사례• 클라이언트 입장에서는

Page 41: Factory method

Factory Method 사용 사례• 클라이언트 입장에서는

팩토리가 뭔 팩토린지 모르겠지만 , 아무튼 생성해라 . 한 줄이면 , 생성한다 .

Page 42: Factory method

Factory Method 사용 사례• 나머지도 , 한번

보면 좋을 것 같다 .

팩토리 찾아와서

Page 43: Factory method

Factory Method 사용 사례• 나머지도 , 한번

보면 좋을 것 같다 .

만들어라

Page 44: Factory method

Factory Method 사용 사례• 전부 –MovableObject–MovableObject Factory

로만 언급된다 .

Page 45: Factory method

Factory Method 사용 사례• 여기서 한가지 더 언급하고 싶은 것은…

– Ogre 는 내가 만든게 아니라 외부에서 제공하는 라이브러리형 엔진이다 .

–즉 , 소스코드가 나한테 없다 . • ( 물론 Ogre 는 소스를 따로 제공하긴 하지만 , 일단 라이브러리만 제공받는다고 치자 .)

Page 46: Factory method

Factory Method 사용 사례

–애초에 코드의 깔끔 / 안 깔끔을 떠나서 확장 가능 클래스냐 , 안 가능한 클래스냐는 외부에 라이브러리 형태로 제공할 때 크게 틀리다 .

–위 Ogre 사례의 경우 난 Ogre 의 코드 없이도 , Ogre 에 없는 MovableObject 들을 얼마든지 더 만들어 낼 수 있다 .

Page 47: Factory method

Factory Method 사용 사례

이런 것이 확장의 중요성

Page 48: Factory method

Factory Method 사용 사례

프레임워크까진 아니지만 , 생성을 서브클래스에 위임하는 방식은 다음에 할 Ab-

stract Factory 구현에도 자주 쓰임 .

Page 49: Factory method

참고• Head First 디자인 패턴 책• Ogre 소스코드