노트

팩토리 메서드 패턴

Factory Method

설계#pattern · 연결된 개념 5개

쉽게 말하면

팩토리 메서드는 공방에 'PDF 문서 하나요'라고 주문하면 알맞은 제품을 골라 만들어 주는 주문 창구예요. 생성자와 달리 의도가 담긴 이름을 붙일 수 있고, 하위 타입이나 이미 만든 것도 내줄 수 있죠.

비유가 깨지는 곳 주문 창구가 늘 이득은 아니에요. 단순한 생성자 호출까지 무조건 팩토리로 감싸면 간접 호출만 늘어나니, 다형성을 위해 하위 클래스를 골라야 할 때처럼 이유가 있을 때 써요.

객체 생성을 생성자 호출 대신 전용 메서드(또는 함수)에 맡기는 패턴. GoF(Gang of Four)의 원래 형태는 상위 클래스가 생성 메서드를 선언하고 하위 클래스가 어떤 제품을 만들지 정하는 구조지만, 실무에서는 "생성을 감싸는 함수" 전반을 넓게 가리키기도 한다.

function createDocument(kind: 'pdf' | 'markdown' | 'html'): Doc {
  switch (kind) {
    case 'pdf': return new PdfDoc()
    case 'markdown': return new MarkdownDoc()
    case 'html': return new HtmlDoc()
  }
}

생성자의 제약에서 벗어난다

  • 생성자는 (자바 같은 대부분의 언어에서) 자기 클래스의 인스턴스만 돌려줄 수 있다. 팩토리는 하위 타입이나 캐시된 객체, 프록시를 돌려줄 수 있다
  • 생성자 이름은 고정이다. 팩토리는 createEngineer()처럼 의도를 이름에 담을 수 있다. 문자열 타입 코드를 인자로 넘기던 new Employee(name, 'E')가 이렇게 바뀐다
  • new가 필요 없어 일반 함수가 오는 자리에 그대로 쓸 수 있다

조건부 로직을 다형성으로 바꾸기을 할 때 알맞은 하위 클래스를 골라 주는 자리로 자주 함께 쓴다. 단순한 생성자 호출을 감추려고 무조건 도입하면 간접 호출만 늘어난다. 같은 생각을 데이터에 적용한 예로 TanStack Query의 쿼리 키 팩토리가 있다. 생성 패턴 전체는 생성 패턴.

출처: Factory Method — Refactoring.Guru · 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · Replace Constructor with Factory Function

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

  • 빌더 패턴

    생성자 인자가 많거나 생성 순서가 복잡한 객체를, 필요한 단계를 하나씩 호출해 조립한 뒤 마지막에 완성품을 받는 패턴.

  • 템플릿 메서드 패턴

    알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.

  • 디자인 패턴

    반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

  • 특이 케이스와 널 객체

    특정 값(가장 흔하게는 null이나 "미확인" 같은 표시값)을 만날 때마다 같은 처리를 하는 코드가 곳곳에 흩어져 있을 때, 그 경우를 대표하는 객체를 하나 만들어 공통 동작을 담는 패턴. null을 대표하면 널 객체(Null Object)라 부르며, 널 객체는 특이 케이스(Special Case)의 한 예다.

보기 옵션