どうも、hamuです。
GoFのデザインパターン(23種)の内の1つであるTemplate Methodパターンについて書いてみたいと思います。
この記事を読むと
- Template Methodパターンがどういうパターンかが分かる
Template Methodパターンとは
テンプレートとは、「型板」や「鋳型」という意味になります。
テンプレートを使用すれば、似たようなものが作れるというようなイメージがあるのではないでしょうか。
Template Methodパターンもイメージとしてはそんな感じになります。
スーパークラスでメソッドなどを定義して、サブクラスでも実装しないといけないので似たようなクラスが出来上がります。
つまりスーパークラスで処理の枠組みを決め、サブクラスで具体的な処理を決めるようなデザインパターンになります。
では実際にサンプルを見ていきたいと思います。
サンプル
サンプルのクラス図
Mainクラス、Recipeクラス、Curryクラス、BeefStewクラスの4つのクラス構成となっています。
Mainクラスは、処理の確認のためにRecipeクラス、Curryクラスを呼び出すテスト用クラスになります。
またRecipeクラスは、CurryクラスとBeefStewクラスの親クラスになります。
サンプルコード(Java)
Mainクラス
public class Main { public static void main(String[] args) { System.out.println("◆カレーの作り方"); Recipe curry = new Curry("カレールー"); curry.cooking(); System.out.println("◆ビーフシチューの作り方"); Recipe beefStew = new Curry("ビーフシチューのルー"); beefStew.cooking(); } }
Recipeクラス
public abstract class Recipe { public abstract void cut(); public abstract void stirFry(); public abstract void Seasoning(); public final void cooking() { cut(); stirFry(); Seasoning(); } }
Curryクラス
public class Curry extends Recipe { private String Seasoning; public Curry(String roux) { this.Seasoning = roux; } public void cut() { System.out.println("具材を切る"); } public void stirFry() { System.out.println("切った具材を炒める"); } public void Seasoning() { System.out.println("煮込んで、" + Seasoning + "で味付け"); } }
BeefStewクラス
public class BeefStew extends Recipe { private String Seasoning; public BeefStew(String roux) { this.Seasoning = roux; } public void cut() { System.out.println("具材を切る"); } public void stirFry() { System.out.println("切った具材を炒める"); } public void Seasoning() { System.out.println("煮込んで、" + Seasoning + "で味付け"); } }
実行結果
◆カレーの作り方 具材を切る 切った具材を炒める 煮込んで、カレールーで味付け ◆ビーフシチューの作り方 具材を切る 切った具材を炒める 煮込んで、ビーフシチューのルーで味付け
処理説明
スーパークラスであるRecipeクラスのcookingメソッドでは、cutメソッド、stirFryメソッド、Seasoningメソッドを順番に呼ぶように定義しています。
そのため、サブクラスであるCurryクラス、BeefStewクラスでも同様に3つのメソッド(cut、stirFry、Seasoning)を呼ぶような形となっています。
Template Methodパターンの利用するメリットは、ロジックを共通化できることです。
例えば、Curryクラス、BeefStewクラスを継承を使わずに作成したとします。
ロジックに誤りがあった場合は、修正を他のクラスにも反映しないといけません。
しかし、Template Methodパターンを利用していれば、テンプレート(スーパークラス)のみ修正すれば、修正が完了します。
まとめ
- Template Methodパターンは枠組みをスーパークラスで決め、具体的な処理をサブクラスで定義するパターン
- Template Methodパターンを利用することでロジックを共通化することができる
この記事があなたのお役に立てればうれしく思います。
最後までお読みいただき、ありがとうございます。
参考図書
今回の記事内容、サンプルプログラムは、以下の書籍を元に作成させて頂きました。
|
コメント