メインコンテンツまでスキップ

🔍 Strategy と Template Method の比較

✅ 比較の目的

Strategy パターンと Template Method パターンは、いずれも処理の一部を差し替えるための設計手法である。
ただし、差し替えの単位やタイミング、コード上の主導権の持ち方が異なる。

本節では両者の違いを明確にし、目的や構造に応じた使い分けの判断軸を提示する。

✅ 比較の観点

比較項目StrategyTemplate Method
実装方法委譲(インターフェースの実装を注入)継承(抽象クラスの実装を継承して差し替え)
柔軟性高い(実行時に切り替え可能)中程度(クラス設計時に決定)
再利用性高い(複数の文脈で再利用しやすい)低め(継承階層に縛られる)
構造の可視性明確(DI により構成が明示される)やや不明瞭(オーバーライドで内部が変わる)
テスト容易性高い(モック注入が可能)中程度(メソッドの挙動が固定)

✅ 共通点

  • どちらも「特定の処理だけを差し替えたい」目的で使われる。
  • 実装の差異を インターフェース/抽象メソッド を通じて外部化している。
  • 共通処理の枠組みの中に、可変な振る舞いを埋め込む設計スタイル。

✅ 決定的な違い

観点StrategyTemplate Method
差し替え方式注入(composition)継承(inheritance)
実行時変更✅ 可能❌ 不可(クラス固定)
クライアント構造Strategy を渡すだけクラスを継承して作成する必要
主導権呼び出し側にある親クラスが全体の流れを支配

✅ 選び分けの判断軸

  • ✅ 柔軟に戦略を切り替えたい → Strategy
  • ✅ 一定の処理の流れは固定したい → Template Method
  • ✅ ユーザーごとに処理内容を動的に変更したい → Strategy
  • ✅ 差し込み箇所は少なく、全体の流れを統制したい → Template Method

✅ UML クラス図

Strategy パターン

Template Method パターン

✅ 実務での設計ヒント

  • Template Method だけで構成すると:処理の流れを統一できるが、拡張がしにくく、継承が乱立する可能性がある。
  • Strategy だけで構成すると:柔軟だが処理の統制が弱くなり、ログや前後処理が散逸しやすい。
  • ▶️ 併用が効果的:Template Method で「流れ」を、Strategy で「処理の中身(通知手段など)」を分離することで、統一感と柔軟性のバランスが取れる。

✅ まとめ

Strategy と Template Method は、いずれも柔軟な設計を支える基本パターンである。
ただし、変更対象の単位や、差し替えのタイミング、構造の主導権といった観点で明確な違いが存在する。

  • 動的に差し替えたい場合、または処理内容が外部依存する場合は Strategy
  • 一連の処理の流れを固定した上で一部のみ差し替えたい場合は Template Method

今後の拡張方向や構成の透明性を踏まえ、目的に応じて適切に使い分けることが重要である。