템플릿 메서드 패턴은 객체 지향 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하는 패턴입니다. 이 패턴을 사용하면 알고리즘의 골격을 정의하고, 각 단계에서 다른 구현을 제공하여 코드 중복을 줄일 수 있습니다.
패턴의 핵심은 "템플릿 메서드"라는 추상 메서드를 가진 추상 클래스를 정의하는 것입니다. 이 클래스는 알고리즘의 골격을 정의하고, 구체적인 구현은 서브클래스에서 제공합니다. 템플릿 메서드는 알고리즘의 각 단계를 호출하는데 사용되며, 서브클래스에서 구현될 수 있는 메서드도 호출됩니다.
예를 들어, 게임에서 캐릭터를 만드는 경우를 생각해보겠습니다. 캐릭터는 머리, 몸, 다리 등으로 구성되어 있으며, 이들 각각을 만드는 과정에서 공통적으로 수행해야 할 작업이 있습니다. 예를 들어, 캐릭터의 각 부분은 위치, 크기, 색상 등의 속성을 가지고 있습니다. 이러한 작업을 수행하는 알고리즘의 골격을 정의할 수 있습니다.
1. 예제 코드
이제, 이 패턴을 Python 코드 예제를 통해 살펴보겠습니다. 아래 코드는 캐릭터 클래스의 예제입니다.
from abc import ABC, abstractmethod
class Character(ABC):
def create(self):
self.add_head()
self.add_body()
self.add_legs()
@abstractmethod
def add_head(self):
pass
@abstractmethod
def add_body(self):
pass
@abstractmethod
def add_legs(self):
pass
class Elf(Character):
def add_head(self):
print("Elf: Adding head")
def add_body(self):
print("Elf: Adding body")
def add_legs(self):
print("Elf: Adding legs")
class Orc(Character):
def add_head(self):
print("Orc: Adding head")
def add_body(self):
print("Orc: Adding body")
def add_legs(self):
print("Orc: Adding legs")
이 코드에서 Character 클래스는 추상 클래스로, create 메서드를 정의하고 있습니다. 이 메서드는 캐릭터를 만드는 알고리즘의 골격을 정의하고, add_head, add_body, add_legs라는 추상 메서드를 호출합니다. 이 클래스를 상속받아 구현한 Elf와 Orc 클래스는 이러한 추상 메서드를 구체적으로 구현합니다.
이제, 아래와 같이 Elf와 Orc 객체를 생성하고 `create` 메서드를 호출해보겠습니다.
elf = Elf()
elf.create()
orc = Orc()
orc.create()
이 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elf: Adding head
Elf: Adding body
Elf: Adding legs
Orc: Adding head
Orc: Adding body
Orc: Adding legs
이 결과를 통해, create 메서드가 add_head, add_body, add_legs 메서드를 호출하고, 이들 메서드는 Elf와 Orc 클래스에서 각각 구현되어 있음을 확인할 수 있습니다.
이와 같이 템플릿 메서드 패턴을 사용하면, 공통된 알고리즘을 갖는 여러 클래스를 쉽게 구현할 수 있습니다. 또한, 추상 클래스에서 알고리즘의 골격을 정의하므로 코드 중복을 피할 수 있습니다.
2. 장점
- 알고리즘의 구조를 추상화하고, 골격을 정의하기 때문에, 알고리즘을 보다 쉽게 이해하고, 변경 및 확장하기 쉽습니다.
- 코드 중복을 줄일 수 있으며, 유지보수성과 확장성을 향상시킬 수 있습니다.
- 일반적인 알고리즘의 구조를 정의하기 때문에, 다른 객체들에서도 활용이 가능합니다.
- 소스 코드의 가독성이 높아집니다.
3. 단점
- 추상 클래스를 상속하는 클래스 수가 많아질수록, 코드 구조가 복잡해질 수 있습니다.
- 일부 구현이 다른 구현보다 더 자주 변경되는 경우, 유연성이 떨어질 수 있습니다.
- 패턴의 도입 자체가 코드의 복잡도를 높일 수 있습니다.
템플릿 메서드 패턴은 공통된 알고리즘이 있는 여러 클래스를 구현하는 경우에 유용합니다. 이 패턴을 사용하면 코드 중복을 줄이고, 유지보수성과 확장성을 높일 수 있습니다. 하지만, 클래스의 상속 구조가 복잡해질 수 있으며, 유연성이 떨어질 수 있습니다.
'설계' 카테고리의 다른 글
[파이썬] 저장소 패턴 (Repository Pattern) 에 대해서 (0) | 2023.03.21 |
---|---|
[디자인 패턴] 비지터 패턴 (Visitor Pattern) - python 예제 코드 (0) | 2023.03.11 |
[디자인 패턴] 스트래티지 패턴 (Strategy Pattern) - python 예제 코드 (0) | 2023.03.11 |
[디자인 패턴] 스테이트 패턴 (State Pattern) - python 예제 코드 (0) | 2023.03.10 |
[디자인 패턴] 옵저버 패턴 (Observer Pattern) - python 예제 코드 (0) | 2023.03.10 |