팩토리 패턴
정의
- 객체 생성 책임을 별도의 팩토리(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