デザインパターン(GoF)/Template Method
本記事ではデザインパターン「Template Method」について勉強していきましょう!
Template Methodは、簡単、且つ、よく使われるデザインパターンになりますので、しっかり覚えて、ソースコード書くときに活用しましょう!
【ゴール】
「Template Methodって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!
さて、ポイントはこの2つ!
この2ポイントについて解説していきます!
デザインパターンとは?
Java、C++、C#などのオブジェクト指向言語でよく使われる設計をパターン化したものをデザインパターンといいます。
本記事のタイトルにもある「GoF」というのは、このデザインパターンを作成した4人組のことで、彼らは全23パターンに分けています。
GoFの全23パターン
- Template Method
- Singleton
- Adapter
- Factory Method
- Facade
- Iterator
- Abstract Factory
- Bridge
- Builder
- Chain of Responsibility
- Command
- Composite
- Decorator
- Flyweight
- Interpreter
- Mediator
- Mement(Snapshot)
- Observer
- Prototype
- Proxy
- State
- Strategy
- Visitor
本日はこの中から、簡単!且つ、よく使われる「Template Method」をご紹介します。
Template Methodの概要
抽象クラス(スーパークラス)で処理の枠組みを決め、具象クラス(サブクラス)で具体的な処理内容を定めるデザインパターンのことです。日本語では「ひな形メソッド」と呼んでいます。
「具体的な処理は異なるが、ざっくりとした処理の流れは同じ」というようなクラスが複数ある、又は、そのようなクラスが今は1つだが今後増える可能性がある時にこのTemlate Method パターンを使います。
Template Methodのクラス図
例として、3つのメソッド(method1~3)を抽象クラスで枠組みだけ用意し、
具象クラスに3つのメソッドの具体的な処理内容を書くクラス図を示します。
例えばtemplateMethodを呼び出すと、method1~3が実行されますが、具体的な処理ConcreteClassに書いてある内容が実行されます。
Template Methodを適用してみる
例としてECサイトで商品を購入する時を見てみましょう。
- 商品を選ぶ
- 購入者情報を入力する
- 商品を購入する
このような流れをこの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が作成したデザインパターンのうちの一つで
抽象クラス(スーパークラス)で処理の枠組みを決め、具象クラス(サブクラス)で具体的な処理内容を定める設計パターンのこと処理の流れを共通化できるときに利用する
ご覧いただきありがとうございました!