🐶

Template Method

2023/09/10に公開

Template Method パターンは、アルゴリズムの骨格を定義するが、一部のステップをサブクラスに委譲することでアルゴリズムの構造を変更することなく特定のステップをオーバーライドするデザインパターンです。

主要な構成要素:

  1. Abstract Class (抽象クラス): アルゴリズムの骨格を定義するテンプレートメソッドを持つクラス。このクラスは、オーバーライド可能な一部のステップを定義することもできます。
  2. Concrete Class (具体クラス): 抽象クラスのメソッドをオーバーライドして具体的な実装を提供するクラス。

例:

簡単な料理の手順を考えてみましょう。

  1. Abstract Class:

    from abc import ABC, abstractmethod
    
    class Recipe(ABC):
        def prepare_dish(self):
            self.gather_ingredients()
            self.cook()
            self.serve()
    
        @abstractmethod
        def gather_ingredients(self):
            pass
    
        @abstractmethod
        def cook(self):
            pass
    
        def serve(self):
            print("Serve the dish on the plate!")
    
    
  2. Concrete Class:

    class PastaRecipe(Recipe):
        def gather_ingredients(self):
            print("Gather pasta, tomato sauce, and cheese!")
    
        def cook(self):
            print("Boil pasta and mix with tomato sauce!")
    
    class SaladRecipe(Recipe):
        def gather_ingredients(self):
            print("Gather lettuce, tomatoes, and dressing!")
    
        def cook(self):
            print("Mix all ingredients and add dressing!")
    
    

使用方法:

    pasta = PastaRecipe()
    pasta.prepare_dish()

    print("---")

    salad = SaladRecipe()
    salad.prepare_dish()

出力:

Gather pasta, tomato sauce, and cheese!
Boil pasta and mix with tomato sauce!
Serve the dish on the plate!
---
Gather lettuce, tomatoes, and dressing!
Mix all ingredients and add dressing!
Serve the dish on the plate!

利点:

  1. コードの再利用: 共通のアルゴリズムの骨格を一度定義することで、具体的な実装を提供する各サブクラスでコードの再利用が促進されます。
  2. 拡張性: 新しい具体的なアクションや振る舞いを追加したい場合、新しい具体クラスを簡単に追加できます。
  3. 制御: 抽象クラスはアルゴリズムの流れやその骨格を完全に制御できますが、具体的な実装はサブクラスに任せることができます。

Template Method パターンは、アルゴリズムや手続きが一部のステップでのみ異なる実装を必要とする場合や、アルゴリズムの特定のステップの実装を変更することなくアルゴリズムの構造を維持したい場合に特に有用です。

Discussion