사용 시점 및 이유
- 인스턴스를 생성하고 복합하는 부분과 인스턴스를 사용하는 부분을 분리할 때
- 제품군(일련의 관련 클래스)를 생성하는데 있어 다른 제품군으로 대체될 가능성이 있을 때
- 관련 클래스들이 함께 사용하도록 설계 되었을 때
패턴 구현
- 팩토리 인터페이스가 있고, 그것을 구현하는 실제 구현체가 있다.
- 구상 클래스 생성 일련의 과정은 팩토리 클래스 내부에 캡슐화 되어 있다.
- 클라이언트는 인터페이스를 통해 구상 클래스(집합)을 생성한다.
- 추가 적인 클래스가 필요하다면, 팩토리 인터페이스를 구현하여 생성하도록 한다.
- Context 는 AbstractFactory 구현체를 받는다.
- Context#create 메소드는 factory의 createProduct(), createItem()을 이용해 필요한 구상 클래스 Result를 만든다.
- Result를 만드는 일련의 과정이 팩토리 모두가 동일하다면, Context가 필요 없이 AbstractFactory를 추상클래스로 선언하고, 추상 메소드에서 그 과정을 메소드로 선언한다.