導入
経験豊富な上司は、
こうして一つの部署Aが仕事を行うのですが、
組織が業務をシンプルに行っていくために、
デザインパターンの学習の最終回となる今回は、
展開
Template Method(テンプレート メソッド)
Template Methodパターンは比較的簡単なデザインパターンです。簡単で、
Template Methodパターンの目的
Templateという単語は、templateMethod
はこれから行う処理の手順の枠組み、
私は、strategyMethod
内に共通の手順があるぞ。そして抽象化してとり出せるぞ」
スーパークラスには抽象化した処理の手順を持たせる。サブクラスが処理の具体的なコードを持つ。同じ手順に従う、

Template Methodパターンは、
AbstractClassを継承するConcreteClassの実装によって、
Template Methodパターンを使う
それでは、
以下にsketch各ファイルへのリンクを示します。
コードの主要部分を示します。
Example_TemplateMethod.pde
void setup(){
String INPUT_DATA = "HoGe";
println("Original Data : " + INPUT_DATA);
AbstractClass ac = new ConcreteClass1();
println(ac.templateMethod(INPUT_DATA));
ac = new ConcreteClass2();
println(ac.templateMethod(INPUT_DATA));
}
まず、AbstractClass
のオブジェクトac
にConcreteClass1
のオブジェクト参照がセットされます。 そしてスーパークラスに実装されているtemplateMethod
が呼ばれ、println
が受け取ってコンソールに表示します。
次に全く同じ手順が繰り返されます。全く同じtemplateMethod
が同じ引数で呼ばれます。ただし、ac
が持つオブジェクト参照はConcreteClass2
のものです。先ほどとは手順が同じでも異なる具体的な処理が施され、
AbstractClassでは、
- 大文字小文字どちらかにそろえ、
前後に装飾を加える method1
- 与えられた文字列の前後に各種のカッコをつける
method2
- 最後にConcreteClassのクラス名を文字列の先頭に加える
method3
以上のメソッドのシグニチャが宣言されます。
public abstract String method1(String val);
public abstract String method2(String val);
public abstract String method3(String val);
そして一定である手順templateMethod
がAbstractClassにまとめられてています。
templateMethod
public final String templateMethod(String val){
return method3(method2(method1(val)));
}
ConcreteClassではそれぞれのメソッドの実装のみを受け持ち、
Strategyパターンとの比較
Template MethodパターンはStrategyパターンとよく似ています。違いは、strategyMethod
が、strategyMethod
が呼ばれ、strategyMethod
呼び出しとなります。これは、
Template Methodパターンでは、templateMethod
は、templateMethod
は、
Template Methodパターンは簡単か?
Template Methodパターンはこれまでに紹介したデザインパターン
デザインパターンの最終回を飾るものとして、
演習
演習1(難易度:easy)
- ディスプレイウインドウに図形を表示するクラスを、
Template Methodパターンで実装しましょう。
以下の条件で作成してください。
AbstractClass
のtemplateMethod
に図形の位置と大きさを指定すると、その場所に図形を表示する。 ConcreteClass1
は、外形線の太さが4、 塗りつぶし色は赤の円を描きます。 ConcreteClass2
は、外形線の太さが10、 塗りつぶし色は青の正方形を描きます。 - ディスプレイウインドウのサイズは(400,400)、
丸の位置は(100,200)、 大きさ50、 正方形の位置は(300,200)、 大きさ50とします。

まとめ
- Template Methodパターンとは何かを学びました。
- Template Methodパターンの使い方を学びました。
学習の確認
それぞれの項目で、
- Template Methodパターンとは何かがわかりましたか?
- 分かった。自分のプログラミングにも使いたい。
- どんなものかを理解することはできたが、
活用シーンが思いつかない。 - 本文が理解できない。
- Template Methodパターンを使えるようになりましたか?
- 使えるようになった。自分のプログラミングにも活用できそうだ。
- 本文の例を理解することはできたが、
自分のプログラミングに活用できる気がしない。 - 本文の例が理解できない。
参考文献
- 『増補改訂版Java言語で学ぶデザインパターン入門』
(結城浩 著、 ソフトバンククリエイティブ) - 誰もが認める最も分かりやすいデザインパターン入門書。
- 『オブジェクト指向における再利用のためのデザインパターン』
(Eric Gamma 著、 ソフトバンククリエイティブ) - デザインパターンの原典。別称
『GoF本』。
- デザインパターンの原典。別称
- 『Java デザインパターン徹底攻略』
(日立ソフトウェアエンジニアリング (株) インターネットビジネス部 著、 技術評論社) - 前掲のGoF本の解説書で、
サンプルはJava言語。絶版。強く再版を望みます。
- 前掲のGoF本の解説書で、
演習解答
コード例を示します。
Template Methodにそってクラスが作成されていることを際立たせるために、
クラス名をパターンの解説そのままにしています。しかしがなら、 図形を表示する、 という仕事であることを明示する名称の方が、 実際のコードでは優先されるべきです。例えば、 AbstractClass
はShapeDrawer
、ConcreteClass1
はRedCircleWithBoldLine
などとしたほうが適切です。また、各メソッド名も仕事を明確に表す名称であるべきです。例えば、 templateMethod
はdrawShape
や単にdraw
などとします。応用課題として、自分の作成したコードについて、 そのようなリファクタリングを施してみましょう。その際、 これらのコード群がTemplate Methodパターンを使用していることを、 どこかに一言コメントするか、 クラス名・ メソッド名にそれを示す単語を含めておくと良いでしょう。後になって、 これらのクラスの関係が不明になってしまうことを避けるためです。 コメントにTemplate Methodパターンを使用していることを明示しておく。 public abstract class AbstractClass{ // Template Methodパターンを使用しています。 (以下略)