프로그래밍/Python

[디자인 패턴] 팩토리 메서드 패턴

Dibrary 2022. 8. 25. 09:50
반응형

안녕하세요 Dibrary입니다.

이번에는 디자인 패턴 중에 '팩토리 메서드 패턴'을 정리해보겠습니다.

단어에 '팩토리'라는 뜻은 말 그대로 factory 즉, '공장'이죠. 공장은 뭐하는 곳이지 아시죠? 주로 물건을 생산하죠.
이름을 보면 생산의 대상이 메서드인 것처럼 보입니다.

 


팩토리 메서드 패턴은 인터페이스는 부모클래스에서 정하지만 구체적인 객체 생성은 자식클래스에서 생성하는 것입니다. 즉, 객체 생성 처리를 서브클래스로 분리해서 처리하게 하는 것이죠.

 

제가 느낀 바로는 결국 초반 인터페이스는 코드가 여러 개로 쓰이지 않고, 하나로 작성한 후에 실질적으로 다형성이 필요한 부분에서 자식 클래스를 어떤 것을 선택하느냐에 따라 다른 결과를 내보이는 것으로 생각했습니다.

 

많이 드는 피자집 예시를 보겠습니다. 

먼저 Pizzastore라는 추상클래스를 만듭니다.
파이썬에는 인터페이스를 JAVA처럼 직접쓸 수 있는 기능이 없어서 abc라는 추상클래스 베이스 모듈을 사용해서 추상클래스를 만들어야 합니다.

orderPizza의 내용은 createPizza가 수행 된 후에 이 객체의 prepare, bake, cut, box를 실행하고 반환하라는 의미죠.

여기서 얼핏 감이 잡히시겠지만, orderPizza가 들어와야 'createPizza'가 실행이 됩니다. createPizza는 밑에 추상메서드로 정의되어 있으므로, 이 메서드는 각 '자식클래스'마다 구현이 되어 있을겁니다.

과연 그런지 보면? 네 제가 2개의 자식클래스 MARUPizzaStore와 SCHOOLPizzaStore를 만들어 두었는데, 둘 다 createPizza 메서드를 구현하고 있습니다.

 

createPizza 메서드 내용은 간단하네요. createPizza메서드가 실행되면 전달인자인 type에 따라 각기 다른 객체를 반환한다는 것이죠.

 


그러면 이제 우리의 궁금증인 피자를 보겠습니다. 피자도 추상클래스로 정의되어 있습니다. 단지 추상메서드가 정의가 안 되어 있는 것 뿐이네요.

실질적인 피자들은 아래 객체로 구현되어 있습니다. 각각 Basic, Cheese, Pepperoni 로 나뉘어 있고, name, dough, sauce가 다르죠.

구조로 보면 아래처럼 되어 있는 셈입니다.

결국 Pizzastore는 어떤 객체를 사용할지에 해당되는 PizzaStore들(MARU, SCHOOL)만 선택하고, 실질적인 실행은 각 PizzaStore가 가지고 있는 객체의 메서드로 실행이 되는 것입니다.

이 메서드를 각각의 6종 피자에 다 써도 되지만, 추상클래스인 Pizza에 몰아 넣었기 때문에 코드 중복이 더 적어졌죠.


실행 결과는 아래와 같습니다.

 

사실 제가 실제로 파이썬으로 구현하던 와중 "코드 중복을 어떻게 하면 없엘 수 있을까, 코드 중복을 없에면서 깔끔해 보일 수는 없을까" 에 대해 고민한 적이 있는데, 그때 이 패턴이 굉장히 유용했습니다.

 

특히나 제가 작성하던 코드의 '기능' 역시 type마다 차이가 있을 뿐, 절차는 동일했었거든요. (바로 이 '절차'가 동일하다는 점이 굉장히 팩토리 메서드 패턴을 쓰기 용이하다고 판단했습니다.)

728x90
반응형