ちゃんなるぶろぐ

エンジニア5年生🧑‍💻 オライリーとにらめっこする毎日。

【5分でわかる🍜🍛】TypeScriptでDesign Pattern〜Template Method Pattern〜

どうも、ちゃんなるです!

今回は、Template Patternに関してTypeScriptの実例を使って説明します🦐🦐🦐

概要

Template Method Patternは、アルゴリズムの骨格を定義し、一部の処理をサブクラスに任せるデザインパターンです💀

これにより、アルゴリズムの構造を変更せずに、特定の処理を変更できる利点があります。

実現方法

Template Methodパターンを実現するには、まず抽象クラスを使用してアルゴリズムの骨格を定義します。

具体的な実装はサブクラスで行います。

抽象クラスでは、共通の処理を実装し、サブクラスでのみ変更が必要な部分を抽象メソッドとして定義します。

それでは、クラス図とサンプルコードを用いて説明していきます🖐️

サンプルプログラムの設計

今回のシナリオでは、異なる種類のドキュメントを生成するプログラムを考えます。 各ドキュメントは、ヘッダー、ボディ、フッターから構成されていますが、その内容は異なります。

Template Method Patternを使って、この問題を解決しましょう!

サンプルコード

構成は下記の通りです🦴

  • DocumentGenerator: 抽象クラスで、アルゴリズムの骨格を定義
  • HTMLDocument: HTMLドキュメント生成の具体的な処理を定義
  • MarkdownDocument: Markdownドキュメント生成の具体的な処理を定義
abstract class DocumentGenerator {
  generate(): string {
    return `${this.generateHeader()}\n${this.generateBody()}\n${this.generateFooter()}`;
  }

  abstract generateHeader(): string;
  abstract generateBody(): string;
  abstract generateFooter(): string;
}

class HTMLDocument extends DocumentGenerator {
  generateHeader(): string {
    return "<!DOCTYPE html><html><head><title>HTML Document</title></head><body>";
  }

  generateBody(): string {
    return "<h1>Hello, World!</h1>";
  }

  generateFooter(): string {
    return "</body></html>";
  }
}

class MarkdownDocument extends DocumentGenerator {
  generateHeader(): string {
    return "# Markdown Document";
  }

  generateBody(): string {
    return "Hello, **World!**";
  }

  generateFooter(): string {
    return "---\nGenerated with love by our awesome service!";
  }
}

クラス図

サンプルコードのクラス図:Mermaid Live Editorで作成

Template Method Patternの使い道

Template Method Patternは、アルゴリズムの一部が異なる場合や、新しい処理を追加したいが既存のアルゴリズムを変更したくない場合に活用できます。

また、Template Method Patternは、StrategyやFactory Methodパターンと組み合わせることで、より柔軟な設計が可能です。

組み合わせられるデザインパターン

Template Methodパターンは、以下のようなデザインパターンと組み合わせて使用できます。

  • Factory Method Pattern: サブクラスのインスタンス化を抽象化し、クライアントが具体クラスを知らずにオブジェクトを生成できるようにする。

chan-naru.hatenablog.com

  • Strategy Pattern: サブクラスではなく、委譲を使ってアルゴリズムの一部を置き換えることができるようにする。

chan-naru.hatenablog.com

まとめ

Template Methodパターンは、アルゴリズムの骨格を抽象クラスで定義し、具体的な実装はサブクラスで行うことで、アルゴリズムの共通部分を再利用し、コードの重複を減らすことができます。

以下のようなシナリオで適用すると良いです🦴

  • アルゴリズムの共通部分を再利用し、コードの重複を減らしたい場合
  • アルゴリズムの一部のみを変更したい場合
  • サブクラスに共通のインターフェースを提供し、拡張性を高めたい場合

参考文献

www.oreilly.com

en.wikipedia.org