この記事は、GoFのデザインパターン23個のうちのTemplate Methodについて解説したものです。
Template Methodパターン以外の解説記事はこちらからどうぞ。
Template Methodとは?
Template Methodパターンとは、メソッドをテンプレートとして用意しておくものです。
テンプレートは処理の枠組みです。
スーパークラスのメソッドで処理の大枠だけを決めておいて、具体的な内容はサブクラスで決めます。
日常生活でもテンプレって言葉を使うときがあると思います。
メールだと、事前に用意された定型文の組み合わせであるテンプレを自分の都合に合わせてカスタマイズしますよね?
それと同じことをプログラムでもやります。
Template Methodを使ったプログラム例
飲み物を自動で作ってくれる機械を例にとってプログラムを作ってみました。
DrinkMaker.java
粉を入れる→液体を入れる→提供するという処理の流れ=テンプレートを定義するクラスです。
ここで、putPowder
とputLiquid
は抽象メソッドなので、細かい処理内容はサブクラスによって変わります。
public abstract class DrinkMaker { public abstract void putPowder(); public abstract void putLiquid(); private void serve() { System.out.println("完成です。"); } // テンプレートメソッド(finalを付けて、サブクラスで変更されないようにする) public final void make() { putPowder(); putLiquid(); serve(); } }
CoffeeMaker.java
コーヒーを作るサブクラスです。
スーパークラスの抽象メソッドを全て実装しています。
public class CoffeeMaker extends DrinkMaker { public void putPowder() { System.out.println("インスタントコーヒーを入れます。"); } public void putLiquid() { System.out.println("お湯を注ぎます。"); } }
MilkteaMaker.java
ミルクティーを作るサブクラスです。
スーパークラスの抽象メソッドを全て実装しています。
public class MilkteaMaker extends DrinkMaker { public void putPowder() { System.out.println("インスタント紅茶を入れます。"); } public void putLiquid() { System.out.println("ミルクとお湯を注ぎます"); } }
Main.java
作成したプログラムの動作を確かめるプログラムです。
サブクラスのインスタンスをスーパークラスのインスタンスに格納しているのがポイントです→LSP
public class Main { public static void main(String[] args) throws Exception { DrinkMaker dm1 = new CoffeeMaker(); DrinkMaker dm2 = new MilkteaMaker(); dm1.make(); dm2.make(); } }
Template Methodのメリットとデメリット
Template Methodパターンでは、スーパークラスで処理の大枠、つまりアルゴリズムを決めているので、サブクラスでは細かな実装をするだけで済みます。
これは、同じようなアルゴリズムを持つクラスを複数作成する時に役立つのが分かると思います。
アルゴリズム自体にバグや変更が発生した時もスーパークラスのみを見ればいいので、修正が楽です。
一方、テンプレートを詳細に作りすぎると、サブクラスでの拡張性が低くなってしまいます。
何が共通化できるかをよく見極める必要があります。
参考書籍
入門とだけあって、非常に分かりやすいです。
Javaの基本的な知識があれば割とすらすら読み進められるのでおすすめです。