デザインパターン ~Template Method~
設計
1. はじめに
GoFのデザインパターンにおける、Template Methodパターンについてまとめます。
2. Template Methodパターンとは
- Templateとは、文字の形に穴が空いている薄いプラスチックの板のことです。Templateを見ればどのような文字が書けるのかは分かりますが、実際にどういう文字になるかは具体的な筆記用具が決まらなければ分かりません。
- Template Methodパターンは、スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定める方式です。
- GoFのデザインパターンでは、振る舞いに関するデザインパターンに分類されます。
3. サンプルクラス図
4. サンプルプログラム
モンスターの名前、攻撃力、守備力を表示するプログラムです。
4-1. AbstractMonsterクラス
テンプレートとなるクラスです。
public abstract class AbstractMonster {
public String name;
public abstract int getAttack();
public abstract int getDefense();
public final void showInfo() {
System.out.print("名前:");
System.out.println(name);
System.out.print("攻撃力:");
System.out.println(getAttack());
System.out.print("守備力:");
System.out.println(getDefense());
System.out.println();
}
}
4-2. Slimeクラス
AbstractMonsterクラスで定義されたメソッドを実装するクラスです。
public class Slime extends AbstractMonster {
public Slime(String name) {
this.name = name;
}
public int getAttack() {
return 15;
}
public int getDefense() {
return 10;
}
}
4-3. Dragonクラス
AbstractMonsterクラスで定義されたメソッドを実装するクラスです。
public class Dragon extends AbstractMonster {
public Dragon(String name) {
this.name = name;
}
public int getAttack() {
return 60;
}
public int getDefense() {
return 45;
}
}
4-4. Mainクラス
メイン処理を行うクラスです。
public class Main {
public static void main(String[] args) {
AbstractMonster slime = new Slime("スライムくん");
AbstractMonster dragon = new Dragon("ドラゴンさん");
slime.showInfo();
dragon.showInfo();
}
}
4-5. 実行結果
名前:スライムくん
攻撃力:15
守備力:10
名前:ドラゴンさん
攻撃力:60
守備力:45
5. メリット
Template Methodパターンでは、スーパークラスのテンプレートメソッドでアルゴリズムが記載されているので、サブクラス側ではアルゴリズムをいちいち記述する必要がなくなります。 例えば、Template Methodパターンを使わず、似たようなクラス、Class1、Class2、Class3・・・を作っていた場合、Class1にバグが発見されると、そのバグをClass2、Class3・・・に反映させなくてはなりません。 Template Methodパターンで作成していれば、テンプレートメソッドにバグが発見された場合でも、テンプレートメソッドさえ修正すればよいことになります。
6. GitHub
7. デザインパターン一覧
8. 参考
今回の記事、及びサンプルプログラムは、以下の書籍を元に作成させて頂きました。
大変分かりやすく、勉強になりました。感謝申し上げます。 デザインパターンやサンプルプログラムについての説明が詳細に書かれていますので、是非書籍の方もご覧ください。