템플릿 메서드 패턴이란?
- 알고리즘의 구조(뼈대)는 유지하면서, 일부 단계의 구현을 하위 클래스에서 정의할 수 있도록 하는 패턴
- 즉, 공통된 알고리즘 흐름을 부모 클래스에 정의하고, 세부적인 구현은 자식 클래스에서 변경할 수 있도록 유도
- 알고리즘의 일정한 흐름을 유지하면서, 특정 부분만 병경 가능
- 코드 중복 줄이고, 유지보수성을 높일 수 있음
구성 요소
1. Abstract Class (추상 클래스)
알고리즘의 뼈대(템플릿 메서드)를 정의
일부 메서드는 abstract로 선언하여 하위 클래스에서 구체적으로 구현하도록 강제
2. Concrete Class(구체적인 클래스)
Abstract Class를 상속바당 추상 메서드를 구체적으로 구현
부모 클래스에서 정의된 알고리즘의 흐름을 따름
패턴 흐름
1. Abstract Class에서 알고리즘의 템플릿(전체 흐름)을 정의
2. Concrete Class에서 구체적인 단계(step)들을 구현
3. 클라이언트는 Concrete Class 객체를 사용하면, 일정한 흐름으로 실행되며 특정 단계만 달라지는 동작을 얻을 수 있음
템플릿 메서드 패턴 예제 (C++)
1. #include <iostream>
2.
3. using namespace std;
4.
5. // 1. 템플릿 메서드를 정의하는 추상 클래스
6. class Beverage {
7. public:
8. // 템플릿 메서드 (전체 알고리즘 흐름을 정의)
9. void prepareBeverage() {
10. boilWater();
11. brew();
12. pourInCup();
13. addCondiments();
14. }
15.
16. // 공통된 알고리즘 (변경 불가능)
17. void boilWater() {
18. cout << "물을 끓입니다." << endl;
19. }
20.
21. void pourInCup() {
22. cout << "컵에 따릅니다." << endl;
23. }
24.
25. // 하위 클래스에서 구현해야 하는 메서드 (변경 가능)
26. virtual void brew() = 0; // 음료 제조 방법 (추상 메서드)
27. virtual void addCondiments() = 0; // 추가 재료 넣기 (추상 메서드)
28.
29. virtual ~Beverage() {}
30. };
31.
32. // 2. 구체적인 클래스 - 커피 만들기
33. class Coffee : public Beverage {
34. public:
35. void brew() override {
36. cout << "커피를 내립니다." << endl;
37. }
38.
39. void addCondiments() override {
40. cout << "설탕과 우유를 추가합니다." << endl;
41. }
42. };
43.
44. // 3. 구체적인 클래스 - 차 만들기
45. class Tea : public Beverage {
46. public:
47. void brew() override {
48. cout << "차를 우립니다." << endl;
49. }
50.
51. void addCondiments() override {
52. cout << "레몬을 추가합니다." << endl;
53. }
54. };
55.
56. // 4. 클라이언트 코드
57. int main() {
58. cout << "커피 준비:" << endl;
59. Coffee coffee;
60. coffee.prepareBeverage(); // 커피 만드는 과정 실행
61.
62. cout << "\n차 준비:" << endl;
63. Tea tea;
64. tea.prepareBeverage(); // 차 만드는 과정 실행
65.
66. return 0;
67. }
템플릿 메서드 패턴 장점
1. 알고리즘의 구조를 부모 클래스에서 정의하므로, 중복 코드가 줄어듦
2. 알고리즘의 흐름을 변경하지 않고, 일부 구현만 변경할 수 있음
3. 새로운 기능을 추가할 때, 부모 클래스를 수정하지 않고, 새로운 하위 클래스를 만들어 확장 가능
템플릿 메서드 패턴 단점
1. 부모 클래스에서 알고리즘의 흐름이 고정되므로, 전체 흐름 자체를 변경하기 어려움
2. 여러 가지 변형이 필요한 경우, 많은 하위 클래스를 만들어야 할 수도 있음
'Unity > 디자인 패턴' 카테고리의 다른 글
| 디자인 패턴 (행위 패턴) - 미디에이터 패턴 (Mediator Pattern) (0) | 2025.08.30 |
|---|---|
| 디자인 패턴 (행위 패턴) - 책임 연쇄 패턴(Chain of Responsibility Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 전략 패턴 (Strategy Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 상태 패턴 (State Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 옵저버 패턴 (Observer Pattern) (0) | 2025.08.30 |