Download - Factory method
Factory Method
13.03.09권승진
목차• FactoryMethod 어디에 쓰는가 ?• FactoryMethod 개요
• 사용 사례
생성과 관련된 패턴• Factory Method• Abstract Factory• Builder• Prototype• Singleton
생성과 관련된 패턴• Factory Method• Abstract Factory• Builder• Prototype• Singleton
Factory Method
어디다 쓰는가 ?
특정 구현이 아닌 인터페이스에 맞춰서 프로그래밍하라 .
어디다 쓰는가 ?• 하지만 결국 생성하는 어딘가에서는…
• 구체적인 클래스를 언급할 수 밖에 없다 .
어디다 쓰는가 ?
사용하는 측
MallardDuck DecoyDuck
사용하는 측에서는 생성 시 구체적인 클래스 이름을 언급할 수 밖에 없다 .(new 를 해야 되기 때문… )
어디다 쓰는가 ?
책에서는 피자 가게를 예로 설명하는데… ..
어디다 쓰는가 ?
그래서 피자가 먹고 싶…
어디다 쓰는가 ?• 이 아니고 ,
• 만약 피자 가게클래스를 만든다면 ,
Factory
피자 클래스를 생성하고 ,
어디다 쓰는가 ?
재료 준비 , 굽기 , 자르기 , 박싱 등의 처리를 할 것이다 .
어디다 쓰는가 ?
문제는 이 부분이 피자가추가될 때마다계속 변경이 필요한 부분이라는 것
어디다 쓰는가 ?• 일단 객체지향 원칙대로 변하는 부분부터 분리
해봅니다 .
어디다 쓰는가 ?
NY 스타일
CA 스타일
어디다 쓰는가 ?일단 빼서 추상화 했더니 ,
1. 피자가 추가될 때 , 피자 가게 자체에서 대응하지 않아도 된다 .
2. 피자공장을 바꾸던지 , 피자 공장 자체를 수정하던지 ..
어디다 쓰는가 ?
사실 이렇게 분리해서 생성 부분을 추상화 시키는 것 자체 만으로도 기본은 한 것인데 ...
어디다 쓰는가 ?
NY 스타일
CA 스타일
뉴욕 피자 가게에선 피자를 자르지 않고 , 박싱해버린다던지…
뉴욕 피자가게 클래스의 orderPizza
어디다 쓰는가 ?
NY 스타일
CA 스타일
자르지도 않고 박싱도 안해서 걍 내보낸다던지…
뉴욕 피자가게 클래스의 orderPizza
어디다 쓰는가 ?
NY 스타일
CA 스타일
사용부 쪽에서 의도하지 않는 대로
Pizza 가 사용될 수 있다 .
Factory Method
• 피자 가공의 일련의 과정들은 물려주고 싶다 .• 대신 피자를 생성할 때만 , 유연성을 주고 싶다 .
Factory Method
그럴 때 사용 하는 것이 Factory Method 이다 .
Factory Method
Factory Method• 사용 측에선 생성 인터페이스만 오버라이드
받아서 구현해라 .
• 나머진 건드리지 말고 ..
Factory Method
• 객체를 처리하는 일련의 프레임워크처럼 만들되 , 객체를 생성하는 부분만 추상화 할 수 있다 .
Factory Method
FactoryMethod 정의객체를 생성하기 위한 인터페이스를 정의하는
데 , 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다 .
Factory Method
PizzaStore
NYCheese NYPepperoni CACheese CAPepperoni
피자 스토어가 직접 객체를 만들면 , 객체간의 개연성이 이렇게 되는데…
Factory Method
Pizza
NYCheese NYPepperoni CACheese CAPepperoni
생성을 서브 클래스에 위임하면서브클래스가 생성을 담당하고 ,
스토어는 피자가 뭐든 간에같은 가공작업을 할 수 있다 .
PizzaStore
Factory Method
Pizza
NYCheese NYPepperoni CACheese CAPepperoni
처음에 만든 , SimpleFactory 도그림을 같다고 볼 수 있으나 ,
가공작업이 중구난방일 수 있다 .
PizzaStore
Factory Method이 그림은 또한 팩토리 패턴이
객체지향 법칙 중 하나인 의존성 뒤집기 법칙(DIP : Dependency Inversion Principle) 을 준수하기 위한 방법 가운데 하나라는 것을 보여준다 .
Factory Method
PizzaStore
NYCheese NYPepperoni CACheese CAPepperoni
Pizza 스토어가 일일히 구체적인 피자들을 언급해가면서( 구체적인 피자 이름을 알아야 함을 뜻함 . ) 의존하고 있는 모습에서
Factory Method
Pizza
NYCheese NYPepperoni CACheese CAPepperoni
PizzaStore 는 구체적인 피자 종류를 몰라도 되고 ( Pizza 클래스만 알면 됨을 뜻함 .)구체적인 피자들 역시 Pizza 라는 이름을 통해 PizzaStore 에 전달된다 .그러면서 화살표 방향이 역전 .이 때문에 inversion 이란 단어가붙음 PizzaStore
Factory Method 사용 사례• Ogre 의 MovableObject• 이름이 Movable 인만큼 , Node 에 attach 될
수 있는 모든 것을 뜻함 .
• 모델이건 , 카메라건 , 라이트건 , Movable이라는 이름으로 제공되야하고 , 생성은 서브클래스가 해야 함 .
Factory Method 사용 사례• 객체가 생성된 직후에는 자신의 생산자가
누군지 , 그리고 , 관리해주는 매니저가 누군지 공통적으로 설정해줘야함 .
Factory Method 사용 사례• createInstanceImpl 는 순수가상함수로
상속 받은 누군가가 구현하도록 한다 .
Factory Method 사용 사례• 그 상속받은 누군가는 Light 가 될 수도 ,
Factory Method 사용 사례• 그 상속받은 누군가는 Entity 가 될 수도
(Ogre 에서 모델역활 )
Factory Method 사용 사례• 구현은 뭐…상속받은 쪽에서 알아서 잘 했을
것이다 .
Factory Method 사용 사례• 클라이언트 입장에서는
Factory Method 사용 사례• 클라이언트 입장에서는
팩토리가 뭔 팩토린지 모르겠지만 , 아무튼 생성해라 . 한 줄이면 , 생성한다 .
Factory Method 사용 사례• 나머지도 , 한번
보면 좋을 것 같다 .
팩토리 찾아와서
Factory Method 사용 사례• 나머지도 , 한번
보면 좋을 것 같다 .
만들어라
Factory Method 사용 사례• 전부 –MovableObject–MovableObject Factory
로만 언급된다 .
Factory Method 사용 사례• 여기서 한가지 더 언급하고 싶은 것은…
– Ogre 는 내가 만든게 아니라 외부에서 제공하는 라이브러리형 엔진이다 .
–즉 , 소스코드가 나한테 없다 . • ( 물론 Ogre 는 소스를 따로 제공하긴 하지만 , 일단 라이브러리만 제공받는다고 치자 .)
Factory Method 사용 사례
–애초에 코드의 깔끔 / 안 깔끔을 떠나서 확장 가능 클래스냐 , 안 가능한 클래스냐는 외부에 라이브러리 형태로 제공할 때 크게 틀리다 .
–위 Ogre 사례의 경우 난 Ogre 의 코드 없이도 , Ogre 에 없는 MovableObject 들을 얼마든지 더 만들어 낼 수 있다 .
Factory Method 사용 사례
이런 것이 확장의 중요성
Factory Method 사용 사례
프레임워크까진 아니지만 , 생성을 서브클래스에 위임하는 방식은 다음에 할 Ab-
stract Factory 구현에도 자주 쓰임 .
참고• Head First 디자인 패턴 책• Ogre 소스코드