템플릿 메서드 디자인 패턴은 기본 클래스에서 알고리즘의 뼈대를 정의하고 하위 클래스가 전체 알고리즘 구조를 변경하지 않고 특정 단계를 재정의할 수 있도록 하는 동작 패턴입니다.
더 잘 이해하기 위해 예를 들어 보겠습니다.
다양한 유형의 주택(예: 콘크리트, 목재, 유리)을 짓고 있다고 가정해 보겠습니다. 재료에 관계없이 건축 과정은 기초, 기둥, 벽, 창문 등 일련의 단계를 따릅니다. 순서는 동일하지만 소재와 디테일이 다릅니다.
Class Diagram
Code
- HouseTemplate이라는 추상 클래스를 만듭니다.
- 구체적인 하위 클래스(예: ConcreteHouse, WoodenHouse, GlassHouse)는 HouseTemplate을 확장하고 각 단계에 대한 특정 구현을 제공합니다.
HouseTemplate.cs
public abstract class HouseTemplate
{
// Template method (defines the overall algorithm)
public void BuildHouse()
{
BuildFoundation();
BuildPillars();
BuildWalls();
BuildWindows();
}
// Abstract methods (to be implemented by subclasses)
protected abstract void BuildFoundation();
protected abstract void BuildPillars();
protected abstract void BuildWalls();
protected abstract void BuildWindows();
}
C#ConcreteHouse.cs
public class ConcreteHouse : HouseTemplate
{
protected override void BuildFoundation()
{
Console.WriteLine("Building concrete foundation");
}
protected override void BuildPillars()
{
Console.WriteLine("Building concrete pillars");
}
protected override void BuildWalls()
{
Console.WriteLine("Building concrete walls");
}
protected override void BuildWindows()
{
Console.WriteLine("Building concrete windows");
}
}
C#WoodenHouse.cs
public class WoodenHouse : HouseTemplate
{
protected override void BuildFoundation()
{
Console.WriteLine("Building wooden foundation");
}
protected override void BuildPillars()
{
Console.WriteLine("Building wooden pillars");
}
protected override void BuildWalls()
{
Console.WriteLine("Building wooden walls");
}
protected override void BuildWindows()
{
Console.WriteLine("Building wooden windows");
}
}
C#Program.cs
HouseTemplate concreteHouse = new ConcreteHouse();
concreteHouse.BuildHouse();
Console.WriteLine();
HouseTemplate woodenHouse = new WoodenHouse();
woodenHouse.BuildHouse();
C#Run
Summary
HouseTemplate 클래스의 BuildHouse() 메서드는 전체 구성 프로세스를 정의하는 반면, 구체적인 하위 클래스는 각 단계에 대한 재료별 구현을 제공합니다. 이러한 방식으로 우리는 맞춤화에 대한 유연성을 허용하면서 건설 프로세스의 일관성을 달성합니다.
템플릿 메서드 패턴은 여러 하위 클래스에 걸쳐 공통 알고리즘 구조를 적용하면서 특정 단계를 전문화하려는 경우에 유용합니다.