Template Methodパターンとは|GoFデザインパターンの解説

デザインパターンとは IT技術
IT技術

Template Methodパターンは、処理の枠組みを定義し、その中の一部の具体的な処理をサブクラスに委譲するデザインパターンです。

このパターンは、コードの再利用性を高め、メンテナンス性を向上させるために非常に有効です。

本記事では、Template Methodパターンの基本的な概念、実際の使い方、およびJava、C++、C#での実装サンプルについて詳しく説明します。

Template Methodパターンとは

Template Methodパターンは、GoFデザインパターンの1つで、オブジェクト指向プログラミングにおいて非常に有用なパターンです。

このパターンは、処理の流れをテンプレートメソッドとして定義し、詳細な処理はサブクラスでオーバーライドして実装する仕組みを提供します。

Template Methodパターンの定義

Template Methodパターンは、スーパークラスにアルゴリズムの枠組みを定義し、具体的なステップはサブクラスに任せます。

これにより、同じアルゴリズムの骨組みを持つ異なる具体的処理を簡単に実装できます。

Template Methodパターンのメリット

Template Methodパターンを使うことで、コードの重複を避けることができ、共通部分はスーパークラスでまとめられます。

また、処理の一貫性を保ちながらサブクラスで柔軟に具体的な処理を実装できるため、メンテナンスの負担が軽減されます。

Template Methodパターンの使い方

Template Methodパターンの使用方法は、抽象クラスにテンプレートメソッドを定義し、その中で呼び出されるメソッドをサブクラスで実装します。

これにより、メインの処理フローは親クラスに委ねられ、具体的な動作はサブクラスで実装されます。

基本構造

基本的なTemplate Methodパターンの構造は次のようになります。

Point
  1. 抽象クラス: アルゴリズムの流れをテンプレートメソッドとして定義する。
  2. 具体クラス: 抽象クラスで定義された一部の処理をオーバーライドして実装する。

Template Methodパターン実装サンプル

ここでは、Template Methodパターンの実装例をJava、C++、C#の3つの言語で紹介します

Javaでの実装

Javaでは、抽象クラスとそのサブクラスを利用してTemplate Methodパターンを実装します。

abstract class Game {
    // テンプレートメソッド
    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }

    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();
}

class Football extends Game {
    @Override
    void initialize() {
        System.out.println("Football Game Initialized!");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started!");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }
}

public class Main {
    public static void main(String[] args) {
        Game game = new Football();
        game.play();
    }
}

C++での実装

C++でも、抽象クラスとそれに派生した具体クラスを使用してTemplate Methodパターンを実装します。

#include <iostream>;

class Game {
public:
    // テンプレートメソッド
    void play() {
        initialize();
        startPlay();
        endPlay();
    }

protected:
    virtual void initialize() = 0;
    virtual void startPlay() = 0;
    virtual void endPlay() = 0;
};

class Football : public Game {
protected:
    void initialize() override {
        std::cout << "Football Game Initialized!" << std::endl;
    }

    void startPlay() override {
        std::cout << "Football Game Started!" << std::endl;
    }

    void endPlay() override {
        std::cout << "Football Game Finished!" << std::endl;
    }
};

int main() {
    Football football;
    football.play();
    return 0;
}

C#での実装

C#でも同様に、抽象クラスを用いたTemplate Methodパターンの実装が可能です。

using System;

abstract class Game {
    // テンプレートメソッド
    public void Play() {
        Initialize();
        StartPlay();
        EndPlay();
    }

    protected abstract void Initialize();
    protected abstract void StartPlay();
    protected abstract void EndPlay();
}

class Football : Game {
    protected override void Initialize() {
        Console.WriteLine("Football Game Initialized!");
    }

    protected override void StartPlay() {
        Console.WriteLine("Football Game Started!");
    }

    protected override void EndPlay() {
        Console.WriteLine("Football Game Finished!");
    }
}

class Program {
    static void Main(string[] args) {
        Game game = new Football();
        game.Play();
    }
}

まとめ

Template Methodパターンは、アルゴリズムの流れを定義し、具体的な処理をサブクラスで実装することでコードの再利用性と拡張性を高めるデザインパターンです。

Java、C++、C#での実装例を通じて、このパターンがどのように利用できるかを確認しました。特に、処理の流れが共通しているが、細部が異なる場合に非常に有効です。

タイトルとURLをコピーしました