<一覧に戻る

テンプレートメソッドパターン

テンプレートメソッドパターンは、スーパークラスでアルゴリズムの骨組みを定義し、サブクラスでその詳細を実装するデザインパターンです。このパターンにより、アルゴリズムの一貫性を保ちながら、サブクラスの振る舞いを変更することができます。

テンプレートメソッドパターンの構成

テンプレートメソッドパターンは主に次の2つのコンポーネントで構成されます。

  1. 抽象クラス(Template Class): アルゴリズムの骨組みを定義します。具体的な処理はサブクラスで実装されます。
  2. サブクラス(Concrete Class): 抽象クラスの定義に基づいて、アルゴリズムの具体的な処理を実装します。

サンプルコード

以下に、テンプレートメソッドパターンを使った簡単なサンプルコードを示します。この例では、コーヒーを作るプロセスとお茶を作るプロセスを示しています。

from abc import ABC, abstractmethod

class CaffeineBeverage(ABC):
    def prepare_recipe(self):
        self.boil_water()
        self.brew()
        self.pour_in_cup()
        self.add_condiments()

    @abstractmethod
    def brew(self):
        pass

    @abstractmethod
    def add_condiments(self):
        pass

    def boil_water(self):
        print("お湯を沸かしています...")

    def pour_in_cup(self):
        print("カップに注いでいます...")

class Coffee(CaffeineBeverage):
    def brew(self):
        print("コーヒーをドリップしています...")

    def add_condiments(self):
        print("砂糖とミルクを加えています...")

class Tea(CaffeineBeverage):
    def brew(self):
        print("お茶を浸しています...")

    def add_condiments(self):
        print("レモンを加えています...")

# 使用例
coffee = Coffee()
coffee.prepare_recipe()

print("\n")

tea = Tea()
tea.prepare_recipe()

コードの解説

抽象クラス CaffeineBeverage

  • CaffeineBeverage は抽象クラスで、prepare_recipe メソッドを定義しています。
  • このメソッドでは、コーヒーまたはお茶を作るための基本的な手順を定義しています。
  • brewadd_condiments メソッドは抽象メソッドとして定義されており、サブクラスで実装される必要があります。

サブクラス CoffeeTea

  • Coffee クラスは CaffeineBeverage を継承し、brew メソッドでコーヒーをドリップする処理を実装しています。また、add_condiments メソッドで砂糖とミルクを加えています。
  • Tea クラスも同様に CaffeineBeverage を継承し、brew メソッドでお茶を浸す処理を実装し、add_condiments メソッドでレモンを加えています。

実行例

  • coffee.prepare_recipe() を呼び出すと、コーヒーを作るための手順が実行され、各メソッドが呼ばれます。
  • tea.prepare_recipe() を呼び出すと、お茶を作るための手順が実行されます。

このように、テンプレートメソッドパターンを使用することで、共通の処理を抽象化し、異なるサブクラスで具体的な処理を実装することができます。これにより、コードの再利用性が向上し、メンテナンスが容易になります。

出力結果: