0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🧩 【Pythonで学ぶデザインパターン】Template Methodパターンでメール作成処理をスマートに!

Posted at

はじめに

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()共通処理 として親で定義。
  • WelcomeEmailPasswordResetEmail は実際の処理内容を提供する サブクラスです。

この構造により、新しい種類のメールを作るときはサブクラスを追加するだけで済みます 🎉

🌟 Template Methodパターンのメリット

メリット 説明
処理の流れを共通化 メール送信処理など、順番や構成が決まっている処理に最適
差分だけ実装できる 件名・本文のような違いだけに集中できる
メンテナンス性が高い 共通部分が1カ所に集約されるため変更が容易
新しい処理の追加が簡単 サブクラスを1つ追加するだけで新パターンに対応できる

🤔 Strategyパターンとの違いは?

Template Methodとの比較でよく出るのが Strategyパターン です。

比較項目 Template Method Strategy
処理の流れ 固定されている 柔軟に切り替え可能
実装方法 継承(サブクラス) 委譲(オブジェクトを渡す)
使いどころ 共通の処理があり、一部だけ差がある アルゴリズム自体を切り替えたい

📝 まとめ

  • Template Methodパターンは「処理の流れを共通化し、一部だけ差し替える」ための強力なパターン。
  • Pythonでは abc モジュールを使って抽象クラスを定義することで簡単に実装可能。
  • 実務でも「メール処理」「ファイル読み込み」「ETL処理」など幅広く活用できます。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?