はじめに
Pythonで設計をよりスマートにしたいなら、「デザインパターン」の活用がおすすめです。
本記事では、その中でも実用性が高い Template Method(テンプレートメソッド)パターン について、Pythonコードを使ってわかりやすく解説します。
🔰 デザインパターンとは?
デザインパターンとは、ソフトウェア開発における「よくある問題の定番の解決策」をパターンとしてまとめたものです。
- コードの再利用性UP
- チーム開発での可読性・共通認識UP
- 拡張・変更がしやすい設計
といったメリットがあります。
📌 Template Methodパターンとは?
Template Methodパターンは、以下のようなケースで使われます:
「処理の大まかな流れは同じだけど、細かい部分だけ違う処理を複数用意したい」
つまり、「処理の流れは固定して、処理の中身は差し替えたい」ときに便利なパターンです。
🧠 Template Methodの構造図(概念)
+-----------------------+
\| Templateクラス(親)|
+-----------------------+
\| + 処理の流れのメソッド | ← テンプレートメソッド
\| + 一部をabstractにする |
+-----------------------+
▲
|
+-----------------------+
\| 具体クラス(子) |
+-----------------------+
\| + 個別処理を実装 |
+-----------------------+
📧 メール作成をTemplate Methodで実装してみよう
ここでは、メール作成処理をTemplate Methodパターンで実装してみます。
- 親クラスでメール送信の流れを定義
- 子クラスで件名・本文をカスタマイズ
- フッターは共通で使いまわし
という構成です。
🐍 サンプルコード:メールテンプレート処理
from abc import ABC, abstractmethod
# 📧 共通のメール作成テンプレート
class EmailTemplate(ABC):
def send_email(self):
subject = self.create_subject()
body = self.create_body()
footer = self.create_footer()
print("=== メール送信 ===")
print(f"件名: {subject}")
print(f"本文:\n{body}")
print(f"{footer}")
print("==================\n")
@abstractmethod
def create_subject(self):
pass
@abstractmethod
def create_body(self):
pass
def create_footer(self):
return "\n--\nこのメールは自動送信されています。"
# 👋 歓迎メール
class WelcomeEmail(EmailTemplate):
def create_subject(self):
return "ようこそ!アカウント登録ありがとうございます"
def create_body(self):
return (
"こんにちは!\n"
"ご登録ありがとうございます。\n"
"サービスをお楽しみください。"
)
# 🔒 パスワードリセットメール
class PasswordResetEmail(EmailTemplate):
def create_subject(self):
return "【重要】パスワードリセットのご案内"
def create_body(self):
return (
"お客様のリクエストにより、パスワードリセットの手続きを行いました。\n"
"以下のリンクから新しいパスワードを設定してください。\n"
"https://example.com/reset"
)
# ✅ 実行例
if __name__ == "__main__":
welcome = WelcomeEmail()
welcome.send_email()
reset = PasswordResetEmail()
reset.send_email()
✅ 実行結果(抜粋)
=== メール送信 ===
件名: ようこそ!アカウント登録ありがとうございます
本文:
こんにちは!
ご登録ありがとうございます。
サービスをお楽しみください。
--
このメールは自動送信されています。
==================
=== メール送信 ===
件名: 【重要】パスワードリセットのご案内
本文:
お客様のリクエストにより、パスワードリセットの手続きを行いました。
以下のリンクから新しいパスワードを設定してください。
https://example.com/reset
--
このメールは自動送信されています。
==================
🔍 コード解説
-
EmailTemplateクラスはテンプレート(雛形)です。-
send_email()が テンプレートメソッド:メール送信の流れを定義。 -
create_subject()やcreate_body()は abstract(抽象メソッド) として子クラスに実装を任せます。 -
create_footer()は 共通処理 として親で定義。
-
-
WelcomeEmailやPasswordResetEmailは実際の処理内容を提供する サブクラスです。
この構造により、新しい種類のメールを作るときはサブクラスを追加するだけで済みます 🎉
🌟 Template Methodパターンのメリット
| メリット | 説明 |
|---|---|
| 処理の流れを共通化 | メール送信処理など、順番や構成が決まっている処理に最適 |
| 差分だけ実装できる | 件名・本文のような違いだけに集中できる |
| メンテナンス性が高い | 共通部分が1カ所に集約されるため変更が容易 |
| 新しい処理の追加が簡単 | サブクラスを1つ追加するだけで新パターンに対応できる |
🤔 Strategyパターンとの違いは?
Template Methodとの比較でよく出るのが Strategyパターン です。
| 比較項目 | Template Method | Strategy |
|---|---|---|
| 処理の流れ | 固定されている | 柔軟に切り替え可能 |
| 実装方法 | 継承(サブクラス) | 委譲(オブジェクトを渡す) |
| 使いどころ | 共通の処理があり、一部だけ差がある | アルゴリズム自体を切り替えたい |
📝 まとめ
- Template Methodパターンは「処理の流れを共通化し、一部だけ差し替える」ための強力なパターン。
- Pythonでは
abcモジュールを使って抽象クラスを定義することで簡単に実装可能。 - 実務でも「メール処理」「ファイル読み込み」「ETL処理」など幅広く活用できます。