Help us understand the problem. What is going on with this article?

デザインパターン ~Template Method~

1. はじめに

GoFのデザインパターンにおける、Template Methodパターンについてまとめます。

2. Template Methodパターンとは

  • Templateとは、文字の形に穴が空いている薄いプラスチックの板のことです。Templateを見ればどのような文字が書けるのかは分かりますが、実際にどういう文字になるかは具体的な筆記用具が決まらなければ分かりません。
  • Template Methodパターンは、スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定める方式です。
  • GoFのデザインパターンでは、振る舞いに関するデザインパターンに分類されます。

3. サンプルクラス図

TemplateMethod.PNG

4. サンプルプログラム

モンスターの名前、攻撃力、守備力を表示するプログラムです。

4-1. AbstractMonsterクラス

テンプレートとなるクラスです。

AbstractMonster.java
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クラスで定義されたメソッドを実装するクラスです。

Slime.java
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クラスで定義されたメソッドを実装するクラスです。

Dragon.java
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クラス

メイン処理を行うクラスです。

Main.java
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. 参考

今回の記事、及びサンプルプログラムは、以下の書籍を元に作成させて頂きました。

大変分かりやすく、勉強になりました。感謝申し上げます。
デザインパターンやサンプルプログラムについての説明が詳細に書かれていますので、是非書籍の方もご覧ください。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away