///[GoF] Abstract Factory Pattern
관련 부품을 조합해서 제품 만들기
* Abstract Factory Pattern
- factory 객체에게 객체 생성을 위임한다
- 팩토리 메소드 패턴보다 한 단계 더 높은 추상화 수준이다
* 의도
- 특정 객체를 전달하기 위해 하나 이상의 구체 클래스에 생성을 위임하는 인터페이스를 제공한다
* 활용
- 객체 생성이 이를 활용하는 시스템과 독립적이어야 할 때
- 시스템이 여러 객체 군을 사용할 수 있어야 할 때
- 구체 클래스들이 클라이언트로부터 분리되어야 할 때
* 디자인 원리
- AbstractFactory : abstract product 객체들을 생성하는 동작을 위한 인터페이스를 선언한다
- ConcreteFactory : Product 객체를 생성하는 동작을 구현한다
- AbstractProduct : product 객체 타입을 위한 인터페이스를 선언한다
- ConcreteProduct : concrete facotry 에서 생성할 product 객체를 정의한다
: AbstractProduct 인터페이스를 구현한다
- client : AbstractFactory 와 AbstractProduct 클래스들에서 선언된 인터페이스만 사용한다
- 추상 팩토리 패턴은 composition + delegation 을 사용한다 (object scope)
- 팩토리 메소드 패턴은 상속을 사용한다 (class scope)
- product 군 중 하나를 사용해야 할때,
- product 객체 군이 함게 사용하도록 설계되어있을 때
- 팩토리는 책임과 파트를 생성하는 과정을 캡슐화한다
- 구현 클래스에서 클라이언트를 격리한다
- product 군을 쉽게 교환한다
- 새로운 종류의 product 를 지원하기 어렵다