추상 팩토리 패턴이란?
- 연관된 객체들을 생성하는 인터페이스(팩토리)를 제공하고, 구체적인 생성은 서브클래스가 담당하는 패턴 함.
- 서로 관련된 객체들을 그룹화하여 일관되게 생성할 수 있도록 함
구성 요소
1. Abstract Factory (추상 팩토리 인터페이스)
연관된 제품들을 생성하는 팩토리 메서드를 정의.
2. Concrete Factory (구체적인 팩토리 클래스)
Abstract Factory를 상속받아 구체적인 제품을 생성하는 팩토리 구현
3. Abstract Product (추상 제품 인터페이스)
Abstract Product를 구현한 구체적인 제품 클래스들
패턴 흐름
1. 추상 팩토리(Abstract Factory)가 여러 개의 제품을 생성하는 인터페이스 정의
2. 구체적인 팩토리(Concrete Factory)에서 실제 제품(Concrete Product) 생성
3. 클라이언트는 팩토리 인터페이스를 통해 제품을 생성하므로, 구체적인 제품 클래스에 의존하지 않음
4. 서로 다른 팩토리 바꾸면 제품군 쉽게 교체 가능
추상 팩토리 패턴 예제 (C++)
1. #include <iostream>
2. #include <memory>
3.
4. using namespace std;
5.
6. // 1. 추상 제품 인터페이스 - 버튼
7. class Button {
8. public:
9. virtual void render() = 0;
10. virtual ~Button() {}
11. };
12.
13. // 2. 구체적인 제품 - Windows 버튼
14. class WindowsButton : public Button {
15. public:
16. void render() override {
17. cout << "Windows 스타일 버튼" << endl;
18. }
19. };
20.
21. // 3. 구체적인 제품 - Mac 버튼
22. class MacButton : public Button {
23. public:
24. void render() override {
25. cout << "Mac 스타일 버튼" << endl;
26. }
27. };
28.
29. // 4. 추상 제품 인터페이스 - 체크박스
30. class CheckBox {
31. public:
32. virtual void render() = 0;
33. virtual ~CheckBox() {}
34. };
35.
36. // 5. 구체적인 제품 - Windows 체크박스
37. class WindowsCheckBox : public CheckBox {
38. public:
39. void render() override {
40. cout << "Windows 스타일 체크박스" << endl;
41. }
42. };
43.
44. // 6. 구체적인 제품 - Mac 체크박스
45. class MacCheckBox : public CheckBox {
46. public:
47. void render() override {
48. cout << "Mac 스타일 체크박스" << endl;
49. }
50. };
51.
52. // 7. 추상 팩토리 인터페이스
53. class GUIFactory {
54. public:
55. virtual unique_ptr<Button> createButton() = 0;
56. virtual unique_ptr<CheckBox> createCheckBox() = 0;
57. virtual ~GUIFactory() {}
58. };
59.
60. // 8. 구체적인 팩토리 - Windows 스타일 GUI
61. class WindowsFactory : public GUIFactory {
62. public:
63. unique_ptr<Button> createButton() override {
64. return make_unique<WindowsButton>();
65. }
66.
67. unique_ptr<CheckBox> createCheckBox() override {
68. return make_unique<WindowsCheckBox>();
69. }
70. };
71.
72. // 9. 구체적인 팩토리 - Mac 스타일 GUI
73. class MacFactory : public GUIFactory {
74. public:
75. unique_ptr<Button> createButton() override {
76. return make_unique<MacButton>();
77. }
78.
79. unique_ptr<CheckBox> createCheckBox() override {
80. return make_unique<MacCheckBox>();
81. }
82. };
83.
84. // 10. 클라이언트 코드
85. void renderUI(GUIFactory& factory) {
86. auto button = factory.createButton();
87. auto checkBox = factory.createCheckBox();
88.
89. button->render();
90. checkBox->render();
91. }
92.
93. int main() {
94. cout << "Windows 스타일 UI 생성:" << endl;
95. WindowsFactory windowsFactory;
96. renderUI(windowsFactory);
97.
98. cout << "\nMac 스타일 UI 생성:" << endl;
99. MacFactory macFactory;
100. renderUI(macFactory);
101.
102. return 0;
103. }
104.
추상 팩토리 패턴 장점
1. 하나의 팩토리가 여러 개의 연관된 객체를 생성하므로, 일관성 유지
2. 클라이언트 코드와 구체적인 제품 클래스가 분리되어 코드를 수정하지 않고 제품 교체 가능
3. 팩토리 메서드 패턴보다 확장성이 뛰어남
추상 팩토리 패턴 단점
1. 팩토리 클래스가 많아질 수 있음
2. 제품군이 늘어날수록 팩토리 클래스도 증가하므로 복잡해질 수 있음
3. 새로운 제품이 추가되면, 모든 팩토리 클래스를 수정해야 하는 번거로움이 있음
'Unity > 디자인 패턴' 카테고리의 다른 글
| 디자인 패턴 (구조 패턴) - 어댑터 패턴 (Adapter Pattern) (0) | 2025.08.30 |
|---|---|
| 디자인 패턴 (생성 패턴) - 빌더 패턴 (Builder Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (생성 패턴) - 싱글톤 패턴 (Singleton Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (생성 패턴) - 팩토리 메서드 패턴 (Factory Method Pattern) (0) | 2025.08.30 |
| 디자인 패턴 - 디자인 패턴이란? (1) | 2025.08.30 |