티스토리 뷰
728x90
Abstract Factory 패턴은 생성 패턴(Creational Pattern)의 하나로, 서로 관련있거나 의존하는 객체들의 그룹을 생성하기 위한 인터페이스를 제공하면서, 구체적인 클래스를 지정하지 않는 디자인 패턴입니다. 이 패턴의 목적은 클라이언트 코드가 생성할 객체의 구체적인 타입과 분리되도록 하는 것입니다. 이를 통해 클라이언트 코드의 유연성과 재사용성을 높일 수 있습니다.
Abstract Factory 패턴의 구성 요소
- Abstract Factory: 추상 팩토리는 구체 팩토리가 구현해야 하는 인터페이스를 정의합니다. 이 인터페이스는 다양한 타입의 추상 제품을 생성하는 메소드를 선언합니다.
- Concrete Factory: 구체 팩토리는 추상 팩토리 인터페이스를 구현하는 클래스로, 특정 제품 패밀리를 생성하는 메소드를 구현합니다.
- Abstract Product: 추상 제품은 팩토리가 생성하는 제품의 인터페이스를 정의합니다.
- Concrete Product: 구체 제품은 추상 제품 인터페이스를 구현하는 클래스로, 구체 팩토리가 생성하는 제품을 나타냅니다.
- Client: 클라이언트는 추상 팩토리와 추상 제품 인터페이스만을 사용하여 제품을 생성하고 사용합니다.
예제: GUI 라이브러리
GUI 애플리케이션을 개발할 때, 다양한 운영 체제에서 실행되도록 여러 종류의 GUI 요소(버튼, 체크박스 등)를 제공해야 할 수 있습니다. Abstract Factory 패턴을 사용하여 이 문제를 해결할 수 있습니다.
AbstractFactory 인터페이스와 ConcreteFactory 클래스
class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual Checkbox* createCheckbox() = 0;
virtual ~GUIFactory() {}
};
class WinFactory : public GUIFactory {
public:
Button* createButton() override {
return new WinButton();
}
Checkbox* createCheckbox() override {
return new WinCheckbox();
}
};
class LinuxFactory : public GUIFactory {
public:
Button* createButton() override {
return new LinuxButton();
}
Checkbox* createCheckbox() override {
return new LinuxCheckbox();
}
};
AbstractProduct 인터페이스와 ConcreteProduct 클래스
class Button {
public:
virtual void paint() = 0;
virtual ~Button() {}
};
class WinButton : public Button {
public:
void paint() override {
cout << "Windows Button\n";
}
};
class LinuxButton : public Button {
public:
void paint() override {
cout << "Linux Button\n";
}
};
class Checkbox {
public:
virtual void paint() = 0;
virtual ~Checkbox() {}
};
class WinCheckbox : public Checkbox {
public:
void paint() override {
cout << "Windows Checkbox\n";
}
};
class LinuxCheckbox : public Checkbox {
public:
void paint() override {
cout << "Linux Checkbox\n";
}
};
클라이언트 코드
int main() {
GUIFactory* factory;
Button* button;
Checkbox* checkbox;
// 운영 체제에 따라 적절한 팩토리 인스턴스를 선택
if (runningOnWindows()) {
factory = new WinFactory();
} else {
factory = new LinuxFactory();
}
// 팩토리를 사용하여 GUI 요소 생성
button = factory->createButton();
checkbox = factory->createCheckbox();
// GUI 요소 사용
button->paint();
checkbox->paint();
// 메모리 정리
delete button;
delete checkbox;
delete factory;
return 0;
}
이 예제에서는 Abstract Factory 패턴을 사용하여 다양한 운영 체제에 대응하는 GUI 요소를 유연하게 생성할 수 있습니다. 클라이언트 코드는 생성되는 객체의 구체적인 클래스에 대해 알 필요가 없으며, 새로운 요소나 요소 패밀리를 추가하려면 추상 및 구체 팩토리, 제품 인터페이스 및 클래스만 수정하면 됩니다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 현포다이브
- 울릉도
- 서귀포블루버블
- PowerShell
- 패턴
- CMake
- Windows
- C++
- 블루버블
- Build
- effective
- 블루버블다이브팀
- script
- DLL
- C#.NET
- 암호화
- 스쿠버다이빙
- 네트워크 정보
- 성산블루버블
- Linux
- OpenSource
- 제주도
- C
- 스쿠버 다이빙
- 외돌개
- C#
- 블루버블다이빙팀
- 서귀포
- C# 고급 기술
- Effective c++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함
250x250