4-2. 추상 팩토리 패턴 (Abstract Factory Pattern)
1. 추상 팩토리 패턴이란 무엇인가?
구체적으로 어떤 클래스의 인스턴스를 사용하는 감춘 상태로 서로 연관된 여러 객체를 생성하는 인터페이스를 제공한다.
구성요소
1) AbstractFactory
- AbstractProduct 객체를 생성하는 인터페이스를 선언한다.
2) ConcreteFactory
- AbstractProduct를 구현하는 구상 객체를 생성하기 위한 행위를 구현한다.
3) AbstractProduct
- 한 종류의 Product 객체의 인터페이스를 선언한다.
4) ConcreteProduct
- 담당한 ConcreteProduct에 의해 생성되는 객체를 정의함.
- AbstractProduct 인터페이스를 구현함.
5) Client
- AbstractFactory / AbstractProduct가 선언한 인터페이스 만 사용함.
2. 동기
기본이 되는 디자인 패턴:
의존성 뒤집기 원칙 (Dependency Inversion Principle): 추상화된 것에 의존하도록 만들어라.
구상 클래스에 의존하도록 만들지 않도록 한다.
- 클라이언트 코드 (인스턴스를 만들어서 쓰는) 코드를 인터페이스 기반으로 하도록 한다.
장점:
1) 구상 클래스를 격리 시킨다.
- 애플리케이션이 생성한 객체를 제어할 수 있게 해준다.
- 팩토리가 객체 생성을 대신하기 때문에, 클라이언트가 객체 생성에 관여하지 않게 해준다.
- 클라이언트는 오직 제공된 추상 인터페이스를 통해 생성된 객체들에 대해 작업을 할 수 잇다
2) Product 군을 변경하는 것이 쉽다.
3) Product 간의 일관성을 제공한다.
- 같은 Product 군끼리 함께 작동하도록 디자인 되어 있다면, 애플리케이션을 사용할 때 한 번에 한 군(family) 씩 사용하는 것이 적절한데, 추상 팩토리 메서드는 이것을 지킬 수 있도록 도와준다.
단점:
1) 새로운 종류의 Product를 만드는 것이 어려워진다.
- AbstractFactory 인터페이스가 생성될 수 있는 Product 군을 고정시키기 때문이다.
- 새로운 종류를 추가하려면 또 AbstractFactory와 그 서브클래스를 모두 바꿔야하는 문제가 생긴다.
3. 개인적인 포인트
1) 팩토리 메서드 VS 추상 팩토리 패턴
- 관점이 다르다
- 팩토리 메서드 패턴: 팩토리를 구현하는 방법 (inheritance)에 초점
- 추상 팩토리 패턴: 팩토리를 사용하는 방법 (composition)에 초점
- 팩토리 메서드 패턴은 구체적인 객체 생성 과정을 서브클래스로 옮기는 것이 목적.
- 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적