アマチュアSEの勉強ブログ

アマチュアSEと一緒に勉強しましょ

デザインパターン(GoF)/Template Method

本記事ではデザインパターン「Template Method」について勉強していきましょう!
Template Methodは、簡単、且つ、よく使われるデザインパターンになりますので、しっかり覚えて、ソースコード書くときに活用しましょう!

【ゴール】

「Template Methodって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!

 

さて、ポイントはこの2つ!

  • GoFが作成したデザインパターンのうちの一つ
  • 抽象クラスで処理の枠組みを決め、具象クラスで具体的な処理内容を定める

この2ポイントについて解説していきます!

 

 

デザインパターンとは?

JavaC++C#などのオブジェクト指向言語でよく使われる設計をパターン化したものをデザインパターンといいます。

本記事のタイトルにもある「GoF」というのは、このデザインパターンを作成した4人組のことで、彼らは全23パターンに分けています。

GoFの全23パターン

  1. Template Method
  2. Singleton
  3. Adapter
  4. Factory Method
  5. Facade
  6. Iterator
  7. Abstract Factory
  8. Bridge
  9. Builder
  10. Chain of Responsibility
  11. Command
  12. Composite
  13. Decorator
  14. Flyweight
  15. Interpreter
  16. Mediator
  17. Mement(Snapshot)
  18. Observer
  19. Prototype
  20. Proxy
  21. State
  22. Strategy
  23. Visitor

本日はこの中から、簡単!且つ、よく使われる「Template Method」をご紹介します。

Template Methodの概要

抽象クラス(スーパークラス)で処理の枠組みを決め、具象クラス(サブクラス)で具体的な処理内容を定めるデザインパターンのことです。日本語では「ひな形メソッド」と呼んでいます。

具体的な処理は異なるが、ざっくりとした処理の流れは同じ」というようなクラスが複数ある、又は、そのようなクラスが今は1つだが今後増える可能性がある時にこのTemlate Method パターンを使います。

Template Methodのクラス図

例として、3つのメソッド(method1~3)を抽象クラスで枠組みだけ用意し、
具象クラスに3つのメソッドの具体的な処理内容を書くクラス図を示します。

f:id:amateurSE:20210827120556p:plain

TemplateMethodのクラス図

例えばtemplateMethodを呼び出すと、method1~3が実行されますが、具体的な処理ConcreteClassに書いてある内容が実行されます。

 

Template Methodを適用してみる

 例としてECサイトで商品を購入する時を見てみましょう。

  1. 商品を選ぶ
  2. 購入者情報を入力する
  3. 商品を購入する

このような流れをこのECサイトを使う人全員が行うことを想定します。

 

public class 佐藤さん {

  public void 商品を選ぶ() {

    //服カテゴリーから選ぶ
    //Tシャツを選ぶ

  }

  public void 購入者情報を入力する() {

    //佐藤と入力

  }

  public void 商品を購入する() {

    //Tシャツを購入

  }

 

public class 鈴木さん {

  public void 商品を選ぶ() {

    //家電カテゴリーから選ぶ
    //髭剃りを選ぶ

  }

  public void 購入者情報を入力する() {

    //鈴木と入力

  }

  public void 商品を購入する() {

    //髭剃りを購入

  }

 佐藤さんと鈴木さん、購入する商品や名前は違えど、ざっくりやることは同じです。

そんな時に、抽象クラスを作成し、ざっくりとした処理の流れを定義しておきます。

public abstract class ECサイト利用者 {

  public void 購入の流れ() {

    商品を選ぶ();
    購入者情報を入力する();
    商品を購入する();

  }

  public abstract void 商品を選ぶ();
  public abstract void 購入者情報を入力する();
  public abstract void 商品を購入する();

「購入の流れ()」メソッドが「Template Method」です。具象クラスには、このテンプレートに沿って具体的な処理内容を書きます。
つまり、佐藤さん、鈴木さんクラスには具体的な商品や購入者情報を記入します。

public class 佐藤さん extends ECサイト利用者 {

  @Override
  public void 商品を選ぶ() {

    //服カテゴリーから選ぶ
    //Tシャツを選ぶ

  }

  @Override
  public void 購入者情報を入力する() {

    //佐藤と入力

  }

  @Override
  public void 商品を購入する() {

    //Tシャツを購入

  }

 

public class 鈴木さん extends ECサイト利用者 {

  @Override
  public void 商品を選ぶ() {

    //家電カテゴリーから選ぶ
    //髭剃りを選ぶ

  }

  @Override
  public void 購入者情報を入力する() {

    //鈴木と入力

  }

  @Override
  public void 商品を購入する() {

    //髭剃りを購入

  }

 すでに抽象クラスの「Template Method」で処理の流れを決めているので、佐藤さん、鈴木さんクラスのような具象クラスでは処理の流れを考える必要はありません。
また、「購入者情報を入力する()」メソッドを書くの忘れてしまった!というようなことも起こりません。

 

まとめ

今回は、デザインパターンである「Template Method」について勉強しました。いかがでしたでしょうか?

「Template Method」について聞かれたときは、下記を言えるようになりましょう!

 Template Methodは、GoFが作成したデザインパターンのうちの一つで
 抽象クラス(スーパークラス)で処理の枠組みを決め具象クラス(サブクラス)で具体的な処理内容を定める設計パターンのこと

処理の流れを共通化できるときに利用する

 

ご覧いただきありがとうございました!