팩토리 패턴

정의

  • 객체 생성 책임을 별도의 팩토리(Factory) 객체에 위임하는 패턴

목적

  • 생성 코드를 한곳에서 관리
  • 클라이언트가 구체 클래스(new XXX())를 몰라도 됨
  • 코드 변경에 강한 구조

어떨 때 사용하나?

  • 객체 생성 방식이 복잡하거나, 조건문이 많을 때
  • 동일한 역할을 하는(=같은 계열의) 여러 객체가 있고, 이를 쉽게 선택하거나 교체할 수 있어야 할 때
  • 새로운 타입의 추가(확장)이 예상되는 경우
  • 객체 생성과 사용을 명확하게 분리하고 싶을 때

팩토리 패턴의 종류

번호 종류 설명
1 단순 팩토리
Simple Factory
단순히 객체 생성 전담 메서드를 한 곳에 모아두는 방식.
GoF디자인 패턴이 아닌, 코딩 관례
2 팩토리 메서드 패턴
Factory Method Pattern
하위 클래스가 생성 방식을 오버라이드 하는 구조
추후 별도 포스팅에서 살펴볼 예정
3 추상 팩토리 패턴
Abstract Factory Pattern
연관된 객체 집합(패밀리)을 한 번에 생성하는 패턴
추후 별도 포스팅에서 살펴볼 예정

단순 팩토리 패턴

  • 이번 포스팅에서는 단순 팩토리 패턴만 알아보도록 한다.
  • 나머지 두 패턴은 추후 별도 포스팅에서 살펴본다.

정의

  • 단순히 객체 생성 전담 메서드를 한 곳에 모아두는 방식.
  • GoF디자인 패턴이 아닌, 코딩 관례

구조

  • 객체 생성 전담 메서드를 둔다.

장단점

장점

  • 생성 코드의 중복성 제거
  • 복잡한 생성 조건문을 숨길 수 있음

단점

  • 조건문이 증가하므로, OCP 를 위반한다.

의사 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TokenizerFactory:
    @staticmethod
    def create(tokenizer_name:str) -> Tokenizer:
        name = name.lower()
        if name == "okt":
            return OktTokenizer()
        elif name == "kkma":
            return KkmaTokenizer()
        elif name == "komoran":
            return KomoranTokenizer()
        elif name == "hannanum":
            return HannanumTokenizer()
        elif name == "whitespace":
            return WhitespaceTokenizer()
        else:
            raise ValueError(f"Unknown tokenizer : {name}")

Comments