テンプレートメソッドとは、
汎用性のあるアルゴリズムを抽象メソッド(中身の無い定義だけのもの)として記述したもので、抽象クラス(インスタンス化を目的としない)内で定義される。
アルゴリズムの中身の具体的な定義は抽象メソッドをオーバーライドするときに定義する。
アルゴリズムの構造はテンプレートメソッドに保持される。

(後で)生成されるサブクラスで詳細を定義するような、”汎用的なアルゴリズム”を定義したいときに使う。
抽象クラスのひとつの使い方って感じなのかな?

テンプレートメソッドが記述されたクラスの例

package  {
	public class AbstractGame {
		//インスタンス化を必要としないので、コンストラクタはいらない
		public function AbstractGame() {
		}
		
		//(finalメソッドは他のクラスからoverrideできない)
		//init()がテンプレートメソッドとなる
		public final function init(){
			createField()
			createTeam("red");
			createTeam("blue");
			startGame();
		}
		
		//直接実行した場合はエラーを投げる
		public function startGame():void{
			throw new Error("Abstract Method!");
		}
		//直接実行した場合はエラーを投げる
		public function createTeam(name:String):void{
			throw new Error("Abstract Method!");
		}
		//直接実行した場合はエラーを投げる
		public function createField():void{
			throw new Error("Abstract Method!");
		}
	}
}

テンプレートメソッドを利用するクラスの例

package  {
	//テンプレートメソッドを含んだクラスを継承
	public class FootballGame extends AbstractGame {
		
		public function FootballGame() {
		}
		
		//AbstractGameクラス内のメソッドをオーバーライド
		public override function  createField():void {
			trace("Create Field");
			//ここに具体的な処理を書く
		}
		public override function  createTeam(name:String):void {
			trace("Create Team");
			//ここに具体的な処理を書く
		}
		public override function  startGame():void {
			trace("start Game");
			//ここに具体的な処理を書く
		}
	}
}

これらを利用するためのドキュメントクラス

package  {
	import flash.display.Sprite;
	
	public class FactoryExample extends Sprite{
		
		public function FactoryExample() {
			//テンプレートメソッドのサブクラスのインスタンスを作る
			var game:FootballGame = new FootballGame();
			//サブクラスから、スーパークラスのメソッド(init())を実行する。
			game.init();
		}
	}
}