概要
Template Method(テンプレートメソッド)パターンは、
アルゴリズムの骨格(流れ)を親クラスで固定しつつ、詳細な処理はサブクラスに委ねる設計パターンである。
処理手順の共通化と、変化する処理のカスタマイズを両立でき、「流れは変えずに中身だけ差し替えたい」ような状況に最適な構造を提供する。
1. なぜTemplate Methodが必要か?
❌ すべての処理がサブクラス任せだと、一貫した手順を保証できない
class Task:
def execute(self):
self.step1()
self.step2()
self.step3()
→ 各サブクラスが execute()
をオーバーライドすると、全体の手順が崩れる可能性がある
✅ アルゴリズムの流れはスーパークラスで確定し、変化する部分だけを抽象化
class Task:
def execute(self):
self.load_data()
self.process()
self.save_results()
→ フレームワークとして手順を提供し、カスタマイズポイントを明示できる
2. 基本構造
✅ 抽象クラスにテンプレートメソッドを定義
class AbstractTask:
def execute(self):
self.load_data()
self.process()
self.save_results()
def load_data(self):
raise NotImplementedError
def process(self):
raise NotImplementedError
def save_results(self):
raise NotImplementedError
✅ サブクラスで具体的な処理を実装
class CSVTask(AbstractTask):
def load_data(self):
print("CSVファイルからデータを読み込む")
def process(self):
print("データを正規化する")
def save_results(self):
print("結果をCSVに保存する")
class DBTask(AbstractTask):
def load_data(self):
print("データベースからデータを読み込む")
def process(self):
print("データを集計する")
def save_results(self):
print("結果をDBに書き戻す")
✅ 使用例
task = CSVTask()
task.execute()
task = DBTask()
task.execute()
出力:
CSVファイルからデータを読み込む
データを正規化する
結果をCSVに保存する
データベースからデータを読み込む
データを集計する
結果をDBに書き戻す
3. Python的応用:フックメソッドの活用とスーパークラスの共通処理
class AbstractTask:
def execute(self):
self.before()
self.process()
self.after()
def before(self):
print("[共通] 処理開始ログ")
def after(self):
print("[共通] 処理完了ログ")
def process(self):
raise NotImplementedError
→ 共通処理を before
/ after
にまとめ、カスタムは process()
に限定
4. 実務ユースケース
✅ データETL処理(Extract → Transform → Load)
→ 各処理の手順は同じでも、抽出元・変換方法・保存先が異なる
✅ Webリクエスト処理フロー(認証 → 処理 → ログ)
→ 全体の流れは同じで、リクエスト内容に応じた処理だけ変更
✅ テストケースの実行フロー
→ setup → execute → teardown
の流れを定義し、中身はサブクラスで定義
✅ 機械学習パイプライン(前処理 → 学習 → 評価)
→ 流れを一定に保ちつつ、モデル・評価指標などを切り替え可能
5. よくある誤用と対策
❌ サブクラスでテンプレートメソッドそのものを上書きしてしまう
→ ✅ テンプレートメソッドには明確に final
的な意味合いを持たせる
❌ オーバーライド前提のメソッドがドキュメントに明記されていない
→ ✅ abstractmethod
や明確なコメントでカスタムポイントを示す
❌ フックメソッドの呼び出し忘れや順序ミス
→ ✅ テンプレートメソッドは必ずスーパークラスで責任を持って構成する
結語
Template Methodパターンとは、“流れを制御し、詳細は委ねる設計”である。
- アルゴリズムの骨格は親クラスに置き、処理のカスタマイズポイントを明確に分離
- 手順の誤用を防ぎながら、共通フローと差異の両立を実現する
- Pythonでは継承・抽象メソッドを用いて、自然にこの構造を表現可能
Pythonicとは、“流れを守りつつ、変化に寛容であること”。
Template Methodパターンはその秩序の知性を、設計の拡張性として定義する技法である。