Skip to main content

Template Method Pattern

View all Design Patterns

알고리즘의 전반적인 구조는 유지하면서 일부 단계를 서브 클래스에서 구현하도록 하는 방법이다. 이로써 전체 알고리즘은 유지하되, 알고리즘의 특정 단계들만 확장할 수 있다.

또한, 객체의 생성을 서브 클래스에 위임하기 때문에, 어떤 클래스의 인스턴스를 생성할지 결정하는 책임을 분리한다.


Class Diagram

Abstract overview

Concrete example


Code

abstract class CodeBuilder {
/** Template method */
execute(): void {
this.lint();
this.format();
this.test();
this.build();
this.deploy();
}

abstract lint(): void;
abstract format(): void;
abstract test(): void;
abstract build(): void;
abstract deploy(): void;
}

class TypeScriptBuilder extends CodeBuilder {
lint(): void {
console.log("Linting TypeScript code");
}

format(): void {
console.log("Formatting TypeScript code");
}

test(): void {
console.log("Testing TypeScript code");
}

build(): void {
console.log("Building TypeScript code");
}

deploy(): void {
console.log("Deploying TypeScript code");
}
}

class PythonBuilder extends CodeBuilder {
lint(): void {
console.log("Linting Python code");
}

format(): void {
console.log("Formatting Python code");
}

test(): void {
console.log("Testing Python code");
}

build(): void {
console.log("Building Python code");
}

deploy(): void {
console.log("Deploying Python code");
}
}

const typescriptBuilder = new TypeScriptBuilder();
typescriptBuilder.execute();
// Linting TypeScript code
// Formatting TypeScript code
// Testing TypeScript code
// Building TypeScript code
// Deploying TypeScript code

const pythonBuilder = new PythonBuilder();
pythonBuilder.execute();
// Linting Python code
// Formatting Python code
// Testing Python code
// Building Python code
// Deploying Python code

이처럼 TypeScript와 Python의 linting, formatting, testing 등의 세부 구현은 각각 서브 클래스에서 구현하면 된다.

팩토리 메서드 패턴(Factory Method Pattern)과의 주요한 차이점은 목적(어디에 초점을 맞추냐)이다.

팩토리 메서드 패턴의 경우, 객체의 생성에, 템플릿 메서드 패턴의 경우 알고리즘의 구조에 초점을 맞춘다.

다르게 표현하면, 팩토리 메서드 패턴에서 객체를 생성하는 방식과 유사하게 템플릿 메서드 패턴에서는 특정 행동을 실행한다고 볼 수 있다.


Pros and Cons

Pros

  • 공통된 로직을 상위 클래스에서 한 번만 작성하면 되기 때문에 코드의 중복을 줄일 수 있다.
  • 기존 코드를 변경할 필요가 없기 때문에, OCP(Open/Closed Principle, 개방/폐쇄원칙)를 준수한다.

Cons

  • 서브 클래스가 상위 클래스가 어떻게 구성 돼 있는지 알아야 하기 때문에 클래스간 응집력을 낮출 수 있다.
Related Links