記憶庫

自分用のメモです。

Template Method パターン

Tepmalte Method とは?

Template Method パターンは GoF デザインパターンの一種であり、処理の枠組みを上位クラスで決めておき、具体的な実装を下位クラスに任せる設計手法である。


Template Method パターンの特徴は以下の通り。

  • 処理内容をサブクラスに記述して欲しいメソッドを abstract にて定義。
  • 処理内容に変更がないメソッドは final にて定義。

簡単な例

まずは、テンプレートとなる上位クラスを実装する。

package knowledgefort.labo.oo.templatemethod;

/**
 * @author おやつ丸
 */
abstract class Profile {
	
	/**
	 * 名前を取得します。実装はサブクラスで行います。
	 * 
	 * @return 名前
	 */
	abstract String getName();
	
	/**
	 * 住所を取得します。実装はサブクラスで行います。
	 * 
	 * @return 住所
	 */
	abstract String getAddress();
	
	/**
	 * 趣味を取得します。実装はサブクラスで行います。
	 * 
	 * @return 趣味
	 */
	abstract String getHobby();
	
	/**
	 * プロフィールを取得します。
	 */
	final String profile() {
		
		StringBuilder _builder = new StringBuilder();
		
		_builder.append("名前は");
		_builder.append(this.getName());
		_builder.append("です。\n");
		
		_builder.append(this.getAddress());
		_builder.append("に住んでいます。\n");
		
		_builder.append("趣味は");
		_builder.append(this.getHobby());
		_builder.append("です。\n\n");
		
		return _builder.toString();
	}
}

上記はプロフィールを出力するだけの簡単なクラス。
profile() メソッドから呼び出される getName()、getAddress()、getHobby() の各メソッドは abstract で定義され、実装をサブクラスに任せている。処理の流れを記述した profile() メソッドはオーバライドさせたくないので final で定義。


使用者は上記クラスを継承し、各自で abstract メソッドをオーバライドする。

例その1

package knowledgefort.labo.oo.templatemethod;

/**
 * @author miyako
 */
class MiyakoProfile extends Profile {
	
	@Override
	String getName() {
		return "ミヤコ";
	}
	
	@Override
	String getAddress() {
		return "世田谷区";
	}
	
	@Override
	String getHobby() {
		return "家庭菜園";
	}
}

例その2

package knowledgefort.labo.oo.templatemethod;

/**
 * @author nao
 */
class NaoProfile extends Profile {

	@Override
	String getName() {
		return "ナオ";
	}
	
	@Override
	String getAddress() {
		return "文京区";
	}

	@Override
	String getHobby() {
		return "料理";
	}
}


上記を実行してみる。

…

System.out.println(new MiyakoProfile().profile());
System.out.println(new NaoProfile().profile());

…

結果は以下の通り。

名前はミヤコです。
世田谷区に住んでいます。
趣味は家庭菜園です。


名前はナオです。
文京区に住んでいます。
趣味は料理です。