객체 생성을 생성자 호출 대신 전용 메서드(또는 함수)에 맡기는 패턴. 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