Creational Patterns(생성 패턴) :: Abstract Factory(추상 팩토리)
구분
객체 생성 (Object Creational)
의도
상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공
사용시기
- 객체가 생성되거나 구성/표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
장점과 단점
1. 구체적인 클래스의 분리
- 추상 팩토리 패턴을 쓰면 응용프로그램이 생성 할 객체의 클래스를 제어할 수 있다. 팩토리는 제품 객체를 생성하는 과정과 책임을 캡슐화한 것이기 때문에 구체적인 구현 클래스가 사용자로부터 분리된다. 일반 프로그램은 추상 인터페이스를 통해서만 인스턴스를 조작한다. 제품 클래스 이름이 구체 팩토리의 구현에서 분리되므로 사용자 코드에는 나타나지 않는다.
2. 제품군을 쉽게 대처할 수 있다.
- 구체 팩토리의 클래스는 응용프로그램에서 한 번만 나타나기 때문에 응용프로그램이 사용할 구체 팩토리를 변경하기 쉽다. 또한, 구체 팩토리를 변경함으로써 응용프로그램은 서로 다른 제품을 사용할 수 있게 변경된다. 추상 패고리는 필요한 모든 것을 생성하기 때문에 전체 제품군은 한번에 변경이 가능하다.
3. 제품 사이의 일관성 확보
- 하나의 군 안에 속한 제품 객체들이 함께 동작하도록 설계되어 있을 때, 응용프로그램은 한 번에 오직 한 군에서 만든 객체를 사용하도록 함으로써 프로그램의 일관성을 갖도록 할 수 있다.
4. 새로운 종류의 제품의 제공이 어려움
- 새로운 종류의 제품을 만들기 위해 기존 추상 팩토리를 확장하기가 어렵다. 생성되는 제품은 추상 팩토리가 생성할 수 있는 제품 집합에만 고정되어 있기 때문이다. 만약 새로운 종류의 제품이 등장하면 팩토리의 구현을 변경해야 한다. 이는 추상 팩토리와 모든 서브클래스의 변경을 가져온다. 즉, 인터페이스가 변경되는 새로운 제품을 생성하는 연산이 추가되거나, 기존 연산의 반환 객체 타입이 변경되므로 이를 상속받는 서브클래스 모두가 변경되어야 한다.
구현의 유의점
1. 팩토리를 단일체로 정의한다.
2. 제품을 생성한다.
3. 확장 가능한 팩토리들을 정의한다.
참조문헌
- GoF의 디자인패턴
댓글 없음:
댓글 쓰기