Template Method パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Template Method パターン(テンプレート・メソッド・パターン)とは、GoF (Gang of Four; 4人組) によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。

クラス図[編集]

以下に Template Method パターンのクラス図を挙げる。

AbstractClass は、public で宣言された templateMethod() と protected で宣言されたいくつかの抽象メソッドを持つ。ConcreteClass は AbstractClass を継承し、AbstractClass で定義されている抽象メソッドを実装する。
AbstractClass は、public で宣言された templateMethod() と protected で宣言されたいくつかの抽象メソッドを持つ。ConcreteClass は AbstractClass を継承し、AbstractClass で定義されている抽象メソッドを実装する。

AbstractClass で定義されている抽象メソッドの可視性が protected (#) なのは、このメソッドが AbstractClass.templateMethod() 内でのみ使用されることを想定しているからである。

利用例[編集]

以下にTemplate Method パターンを使って文字列型配列を書式化してリストアップするJavaプログラムの例を示す。

abstract class StringLister {
    protected abstract String formatHeader();
    protected abstract String formatItem(String item);
    protected abstract String formatFooter();
    public final String display(String[] items) {
        StringBuilder result = new StringBuilder(this.formatHeader());
        for (String item : items) {
            result.append(this.formatItem(item));
        }
        result.append(this.formatFooter());
        return result.toString();
    }
}

class PlainTextStringLister extends StringLister {
    protected String formatHeader() {
        return "";
    }
    protected String formatItem(String item) {
        return " - " + item + "\r\n";
    }
    protected String formatFooter() {
        return "";
    }
}

class HtmlStringLister extends StringLister {
    protected String formatHeader() {
        return "<ul>\r\n";
    }
    protected String formatItem(String item) {
        return "  <li>" + item + "</li>\r\n";
    }
    protected String formatFooter() {
        return "<ul>\r\n";
    }
}

public class TemplateMethodTest {
    public static void main(String[] argv) {
        String[] items = {"First", "Second", "Third"};
        StringLister l1 = new PlainTextStringLister();
        StringLister l2 = new HtmlStringLister();
        System.out.println(l1.display(items));
        System.out.println(l2.display(items));
    }
}

このサンプルを実行すると、次の実行結果が得られる。最初の3行が PlainTextStringLister.display() の返り値で、空行を挟んでその後にある出力が HtmlStringLister.display() の返り値である。

 - First
 - Second
 - Third

<ul>
  <li>First</li>
  <li>Second</li>
  <li>Third</li>
</ul>

参考までに、クラス図との対応関係を示す。

AbstractClass
StringLister
AbstractClass.templateMethod()
StringLister.display()
ConcreteClass
PlainTextStringLister, HtmlStringLister

関係するパターン[編集]

Factory Method パターンは、内部に Template Method パターンを包含することが多い。

関連項目[編集]

脚注[編集]