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