Template Method パターン
Template Method パターン(テンプレート・メソッド・パターン)とは、GoF (Gang of Four; 4人組) によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。
クラス図
以下に Template Method パターンのクラス図を挙げる。
![AbstractClass は、public で宣言された templateMethod() と protected で宣言されたいくつかの抽象メソッドを持つ。ConcreteClass は AbstractClass を継承し、AbstractClass で定義されている抽象メソッドを実装する。](http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Template_Method_UML_class_diagram.svg/450px-Template_Method_UML_class_diagram.svg.png)
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 パターンを包含することが多い。
関連項目
- Factory Method パターン
- デザインパターン (ソフトウェア)
脚注
[脚注の使い方]
デザインパターン | |||||||
---|---|---|---|---|---|---|---|
GoFによる23種のパターン |
| ||||||
並行性に関するパターン |
| ||||||
アーキテクチャに関するパターン |
| ||||||
その他のパターン | |||||||
関連する人々 |
| ||||||
関連項目 | |||||||
|