Abstract Factory는 객체 생성의 추상화를 통해 서로 관련 있거나 독립적인 객체 그룹을 생성할 수 있도록 설계된 생성 패턴입니다. 이 패턴은 구체적인 클래스의 인스턴스를 직접 지정하지 않고, 객체 생성 인터페이스를 제공하여 구현 간의 결합도를 줄이는 데 중점을 둡니다.
C++에서 이 패턴은 다양한 객체 생성 작업을 캡슐화하고 서로 관련된 객체들이 일관되게 생성되도록 보장합니다. 이 과정에서 객체 생성의 구체적인 세부사항을 클라이언트 코드로부터 숨기며, 클라이언트는 단순히 팩토리를 호출하기만 하면 됩니다.
Abstract Factory 패턴의 핵심 원리
1. 객체 생성의 추상화
클라이언트 코드에서 제품 객체를 직접 생성하지 않고, 팩토리를 통해 생성합니다.
즉, 구체적인 제품 클래스는 클라이언트 코드에서 노출되지 않습니다.
구성 요소
- Abstract Factory (추상 팩토리)
- 객체를 생성하기 위한 인터페이스(순수 가상 클래스)를 정의합니다.
- 제품군(Product Family)에 속하는 객체들을 생성하는 역할을 담당합니다.
- Concrete Factory (구체 팩토리)
- Abstract Factory를 구현하여 구체적인 객체 생성 논리를 제공합니다.
- 각 팩토리는 특정 플랫폼이나 요구사항에 맞는 제품군 객체를 생성합니다.
- Abstract Product (추상 제품)
- 팩토리가 생성할 객체들의 공통 인터페이스를 정의합니다.
- 이를 통해 제품군 내 객체들 간의 일관성을 유지할 수 있습니다.
- Concrete Product (구체 제품)
- Abstract Product를 실제로 구현한 클래스입니다.
- 예를 들어, Windows와 Mac 환경에 각각 적합한 Button과 Checkbox를 정의합니다.
- Client (클라이언트)
- Abstract Factory와 Abstract Product에 의존합니다.
- 구체적인 제품 클래스나 팩토리를 알 필요가 없습니다.
Abstract Factory 작동 흐름
- 팩토리 생성
클라이언트는 특정 환경에 맞는 팩토리 객체를 생성합니다.
예: WindowsWidgetFactory, MacWidgetFactory. - 객체 생성 요청
클라이언트는 팩토리 객체를 통해 필요한 제품군의 객체를 생성합니다.
제품군 내의 객체들(Button, Checkbox 등)은 서로 독립적으로 생성되지만, 같은 컨텍스트(Windows, Mac 등)에 속합니다. - 제품 사용
생성된 객체는 인터페이스(추상 클래스)를 통해 사용되며, 클라이언트는 구체적인 구현을 알 필요가 없습니다.
실제 예제: 운영 체제 기반 UI
운영 체제에 따라 다른 UI 위젯을 제공하는 예를 들어보겠습니다.
출력 결과
Abstract Factory의 장점
- 일관성 유지:
제품군 내 객체들은 항상 같은 컨텍스트에 속하므로, 일관성이 유지됩니다.- 예: Windows 팩토리는 Windows 스타일의 버튼과 체크박스만 생성.
- 유연성 증가:
클라이언트는 제품의 구체적인 구현에 의존하지 않습니다. 따라서 쉽게 교체하거나 확장할 수 있습니다. - 의존성 역전 원칙(DIP) 준수:
클라이언트는 구체적인 클래스가 아니라 추상화된 인터페이스에 의존합니다.
Abstract Factory의 단점
- 복잡성 증가:
많은 인터페이스와 클래스가 추가되므로 코드가 복잡해질 수 있습니다. - 확장 시 추가 작업:
새로운 제품군을 추가하려면 관련된 팩토리와 제품 클래스를 모두 정의해야 합니다.
활용 사례
- 크로스 플랫폼 UI 라이브러리 (Qt, GTK 등).
- 데이터베이스 연동 라이브러리 (Oracle, MySQL 등 다양한 드라이버 지원).
- 게임 개발에서 월드 생성 시스템.
'Computer Programming > C,C++,MFC' 카테고리의 다른 글
[C++] 팩토리 메서드 (Factory Method) 패턴 설명 및 사용 예제 (0) | 2024.11.15 |
---|---|
[C++] 싱글턴 (Singleton) 설명 및 사용 예제 (0) | 2024.11.14 |
[C++] 디자인 패턴이란? (0) | 2024.11.12 |
[C++] C++ 에서 JSON 파싱시 오류 방지를 위한 방법 (0) | 2024.11.12 |
[C++] std::lock_guard 기본 설명 및 예제 (0) | 2024.11.07 |