スポンサーリンク

Template Methodパターンとは?Pythonで学ぶ抽象クラス・抽象メソッドの使い方

Python入門

1.はじめに|同じ流れの処理を“ひな型”でスマートに

プログラムを書いていると、「だいたい同じだけど、ちょっとだけ違う処理」がたくさん出てきます。
たとえば「メール文の自動生成」や「ファイルの保存処理」など、どれも基本の流れは同じ。でも、出力する内容や形式は少しずつ違いますよね。

こんなとき、毎回ゼロから同じようなコードを書くのは、ちょっと面倒だしミスもしやすいです。
そこで登場するのが「Template Method(テンプレートメソッド)」というデザインパターンです。

Template Methodは、「処理の流れ(テンプレート)」を1つの場所にまとめておいて、中身だけを必要に応じて差し替えるという考え方です。Pythonでは「抽象クラス」や「抽象メソッド」という機能を使って、このパターンを実現できます。

この記事では、Template Methodパターンの仕組みやメリット、Pythonでの実装方法を初心者にもわかるように丁寧に解説します。

「コードの流れは共通にしたいけど、細かい部分だけ変えたい」
そんなときに役立つ考え方を、一緒に学んでいきましょう!




2.デザインパターンとは

「デザインパターン」と聞くと、難しそうに感じるかもしれませんが、簡単に言えば**よくあるプログラムの設計パターン(型)**のことです。

プログラミングをしていると、似たような問題に何度も出会います。たとえば「ファイルの読み書き処理を統一したい」「いろんな条件に応じて処理を切り替えたい」といったことです。こうした“よくある課題”に対して、「こう書けばうまくいくよ」という成功パターンをまとめたのがデザインパターンです。

この考え方は、1994年に出版された有名な本『オブジェクト指向における再利用のためのデザインパターン』で一気に広まりました。著者は「Gang of Four(GoF/4人組)」と呼ばれる開発者たちで、彼らが紹介した23の基本パターンは、今でも多くの現場で使われています。

Pythonのようなオブジェクト指向言語では、こうしたパターンを使うことで

  • コードの再利用性が高まる
  • チームでの設計がスムーズになる
  • 将来の変更にも柔軟に対応できる

といったたくさんのメリットがあります。

本記事で紹介するTemplate Methodパターンも、そうしたデザインパターンのひとつ。処理の“流れ”をテンプレートとして共通化しつつ、必要なところだけを柔軟に差し替えられるのが特徴です。




3.Template Methodの概念|“処理の流れ”をテンプレート化しよう

Template Method(テンプレートメソッド)は、処理の流れ(手順)をあらかじめテンプレートとして用意しておくデザインパターンです。
そのテンプレートに沿って、細かい中身だけを差し替えて使うことで、コードの整理や再利用がしやすくなります。

たとえば「メール文を作るクラス」を考えてみましょう。

メールは一般的にこんな流れで作られます:

  1. 宛名(相手の名前)
  2. 本文(伝えたい内容)
  3. 署名(差出人の名前など)

この「1→2→3」という流れはどのメールでも同じですが、具体的な内容はメールの種類によって違います。
たとえば、

  • お客様向け:丁寧な言葉づかい
  • 社内連絡:カジュアルな文面
  • エラー通知メール:技術的な説明を含む

…といった感じですね。

Template Methodパターンでは、この共通の流れだけを**親クラス(テンプレート)として作り、
内容の違う部分は
子クラス(サブクラス)**で自由に定義できるようにします。

イメージ図:

親クラス:
create() → header() → body() → footer()
↑ ↑ ↑
サブクラスで中身を実装!

このように、「処理の順番は同じだけど中身は変えたい」ような場面で、Template Methodパターンはとても便利です。

次は、このTemplate MethodをPythonでどう書くか、実際のコード例とともに見ていきましょう!




4.PythonでのTemplate Methodの具体的な実装方法

Template MethodパターンをPythonで使うには、抽象クラス抽象メソッドという仕組みを使います。

「抽象クラス?なにそれ?」と思った方もご安心を。これから順を追って、やさしく解説していきますね。


1. 抽象クラスを作ろう

まず、共通の処理の流れ(テンプレート)を持つクラスを「抽象クラス」として作成します。
Pythonでは abc モジュールを使って抽象クラスを定義できます。

from abc import ABCMeta, abstractmethod

class MailTemplate(metaclass=ABCMeta):
def __init__(self, name: str):
self.name = name

def create(self) -> str:
return self.header() + "\n" + self.body() + "\n" + self.footer()

このクラスでは、create() というメソッドが「メール文を作る流れ」をまとめています。
ただし、header()body()footer() の中身はまだ作っていません。


2. 抽象メソッドで“空の枠”を定義する

次に、このテンプレートの中で使われている header() などのメソッドを「抽象メソッド」として定義します。

    @abstractmethod
def header(self) -> str:
pass

@abstractmethod
def body(self) -> str:
pass

@abstractmethod
def footer(self) -> str:
pass

このようにしておくと、「このクラスを使う人は、必ずこれらのメソッドを自分で書いてね」というルールが作れます。


3. サブクラスで具体的な処理を書く

では、このテンプレートを使って実際のメールを作ってみましょう。
たとえば「お客様向けのメール」を作るなら、こんな感じです。

class CustomerMail(MailTemplate):
def header(self) -> str:
return f"{self.name} 様\n"

def body(self) -> str:
return "いつもご利用いただきありがとうございます。\n本日は新商品のお知らせです。"

def footer(self) -> str:
return "\n株式会社サンプルカンパニー"

4. 実際に使ってみよう!

あとはこのクラスを使って、テンプレート通りにメール文を生成できます。

mail = CustomerMail("田中")
print(mail.create())

出力される内容:

コピーする編集する田中 様

いつもご利用いただきありがとうございます。
本日は新商品のお知らせです。

株式会社サンプルカンパニー

このように、テンプレート(親クラス)で処理の流れを決めておき、
中身だけをサブクラスで自由に書き換えられるのがTemplate Methodパターンの特徴です。




5.Template Methodを使うメリット

Template Methodパターンを使うと、コードの見通しが良くなり、再利用性もアップします。
ここでは、主なメリットを3つにまとめてご紹介します。


1. クラスの作成がカンタンになる

テンプレート(抽象クラス)があると、「共通の流れ」を毎回書かなくてOKになります。

つまり、「header・body・footerの順にメールを作る処理」は1回書くだけで済みます。
あとは中身だけサブクラスで作ればいいので、新しいクラスを作るのがグッと楽になります!


2. 共通処理が1か所に集まる=修正もラク!

テンプレートの中で、処理の流れが一元化されているため、

「共通部分の修正は1か所だけでOK!」

という状態が作れます。

たとえば、メール文を「HTML対応にしたい」と思ったら、親クラスの create() を1回修正するだけでOK。
すべてのサブクラスにその変更が反映されます。


3. ポリモーフィズムで複数のクラスを一括操作!

Template Methodを使って作ったクラスは、どれも同じ「テンプレート」に沿っているので、
どのクラスかを意識しなくても、まとめて同じように扱えます。

たとえば、以下のように複数のメールタイプをリストに入れて、一括で create() を呼び出すことができます。

mails = [
CustomerMail("田中"),
EmployeeMail("山田"),
SystemNoticeMail("佐藤")
]

for mail in mails:
print(mail.create())
print("-" * 40)

このように、「どのクラスか」に関係なく、**共通のインターフェース(createメソッド)**で使えるようになるんです。
これが「ポリモーフィズム(多態性)」の大きな魅力です。




6.Template MethodはPython以外でも使える?

ここまで読んで、「Template MethodってPython独特の書き方なのかな?」と思った方もいるかもしれません。

でも実は、Template MethodパターンはPythonだけのものではなく、JavaやC++、C#など、ほとんどのオブジェクト指向言語で使える考え方です。

どの言語でも、

  • 「処理の流れ」を共通化したい
  • 中身だけをそれぞれ自由にしたい

というニーズはよくあります。そんなとき、Template Methodはとても便利なんですね。

ちなみに、Template Methodのような「設計の考え方」は、**“言語の機能”というより“設計の知恵”**に近いもの。だからこそ、いろんな言語で応用できるし、覚えておくと他のプロジェクトやチーム開発でもきっと役立ちます。




まとめ|Template Methodで共通処理をスマートに!

今回は、Pythonで使えるTemplate Methodパターンについて解説しました。

Template Methodは、「処理の流れ(テンプレート)」をあらかじめ決めておいて、
その中の一部だけをサブクラスで差し替えるという考え方です。

これにより、

  • クラス作成がカンタンになる
  • 共通部分の修正がラクになる
  • 複数のクラスをまとめて扱える(ポリモーフィズム)

といったメリットが得られます。

特に「だいたい同じだけど中身が違う処理」が複数あるときに、とても力を発揮します。

Pythonで本格的にクラス設計をしていきたい人にとって、Template Methodは覚えておいて損はないパターンです。
ぜひ、あなたのコードにも取り入れてみてください!


あわせて読みたい

Template Methodパターンをもっと深く理解したい方は、こちらの記事もおすすめです!


よくある質問(Q&A)

Q
Template Methodパターンは、どんなときに使えばいいの?
A

「処理の流れは同じだけど、部分的に違う動きをさせたい」ときに便利です。
たとえば、メール作成、ログ出力、ファイル保存など、“流れが決まっているけど中身だけ変えたい”処理に向いています。

Q
抽象クラスって絶対に使わないとダメ?
A

必須ではありませんが、抽象クラスを使うと「このメソッドは必ず作ってね」というルールを明確にできるため、設計ミスが減ります。複数人で開発する場合にも特に役立ちます。

Q
サブクラスでcreate()を変更したい場合はどうする?
A

特別なケースで、テンプレートの流れを一部だけ変えたい場合は、create()をサブクラスでオーバーライドしてカスタマイズすることも可能です。ただし、その際は処理の順番や共通ロジックを壊さないよう注意が必要です。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク