부모 클래스에 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴이다.
new 연산자를 사용한 객체 생성 직접 호출들을 특별한 팩토리 메서드에 대한 호출들로 대체하라고 제안한다.
객체들은 new 연산자를 통해 생성되지만 팩토리 메서드 내에서 호출된다. 참고로 팩토리 메서드에서 반환된 객체는 종종 제품이라고 불린다.
생성자 호출을 프로그램의 한 부분에서 다른 부분으로 옮기는 변경은 무의미해 보이지만, 이런 변경은 자식 클래스에서 팩토리 메서드를 오버라이딩하고 그 메서드에 의해 생성되는 제품들의 클래스를 변경할 수 있게 된다.
약간의 제한으로 자식 클래스들은 다른 유형의 제품들을 해당 제품이 공통 기초 클래스 또는 공통 인터페이스가 있는 경우에만 반환할 수 있다. 또한 공통 인터페이스로 기초 클래스의 팩토리 메서드의 반환 유형을 선언해야 한다.
팩토리 메서드를 사용하는 코드를 종종 클라이언트 코드라고 부르며, 클라이언트 코드는 다양한 자식 클래스들에서 실제로 반환되는 여러 제품 간의 차이에 대해 알지 못한다. 클라이언트 코드는 모든 제품을 추상으로 간주한다. 클라이언트는 모든 객체들이 메서드를 가져야 한다는 사실을 잘 알고 있지만, 이 메서드가 정확히 어떻게 작동하는지는 클라이언트에게 중요하지 않다.
팩토리 메서드의 구조
- 제품 : 인터페이스를 선언. 인터페이스는 생성자와 자식 클래스들이 생성할 수 있는 모든 객체에 공통이다.
- 구상 제품 : 제품 인터페이스의 다양한 구현들을 말한다.
- 크리에이터 : 클래스는 새로운 제품 객체들을 반환하는 팩토리 메서드를 선언한다. 이 팩토리 메서드의 반환 유형은 반드시 제품 인터페이스와 일치해야 한다.
- 구상 크리에이터 : 기초 팩토리 메서드를 오버라이드하여 다른 유형의 제품을 반환하게 한다.
크리에이터는 제품을 생성하지 않는다. 일반적으로 크리에이터 클래스에는 이미 제품과 관련된 핵심 비즈니스 로직이 있으며, 팩토리 메서드는 이 로직을 구상 제품 클래스로부터 디커플링(분리) 하는 데 도음을 주기만 한다.
예를 들어 회사의 주 임무는 프로그래머 교육이 아닌, 코드를 작성하는 것이다.
팩토리 메서드는 항상 새로운 인스턴스들을 생성할 필요가 없다. 팩토리 메서드는 기존 객체들을 캐시, 객체 풀 또는 다른 소스로부터 반환할 수 있다.