Template/ Factory Method

Template method

ベースクラスにテンプレートメソッドを実装、他はサブクラスにデレゲーする、そういう設計
なので、ベースクラスの設計を分かりやすくしておくこと(コメント、ドキュメントとかを作っとく)
要は、デレゲーションさせる設計はテンプレートメソッドなのだと、言ってしまいたい。->ちょっとこれは違うな。デレゲーションは、クラスが他オブジェクトに、自分が受け持つメソッドの処理を引き渡す、すなわち、文字通り委譲する、その移譲するオブジェクトを抱えているという事なのだろう。先にも赤で書いたとおり、「サブクラスにデレゲート」というのが、Tempplate methodの本質か。

Factory Method

インスタンスの作成をファクトリーベースクラスのテンプレートメソッドコールで行う。ファクトリーメソッド(モデルクラスを実際に生成したりする)はサブクラスで実装する。

<?php

abstract class ModelBase{
  abstract function do_something();
  final function must_do_it(){
    echo "<br /><br />First of all, let's have a coffee.<br />";
  }
}

class SomeModel extends ModelBase{
  function do_something(){
    $this->must_do_it();
    echo "Next, we have on a chat each other.<br/>";
  }
}

class AnotherModel extends ModelBase{
  function do_something(){
    $this->must_do_it();
    echo "Next, we'll welcome another one.<br/>";
  }
  function do_something_else(){
    echo "Something Else<br/>";
  }
}

abstract class FactoryBase{
  abstract function factory_method();
  final function create(){ //<--クリエータークラス
    return $this->factory_method();//<-- インスタンス生成をサブクラスにデレゲーションする
  }
}


class Factory extends FactoryBase{
  function factory_method(){
    return new AnotherModel();
  }
}

class AnotherFactory extends FactoryBase{
  function factory_method(){
    return new SomeModel();
  }
}

$factory_a = new Factory;
$factory_b = new AnotherFactory;

$model_a = $factory_a->create();
$model_b = $factory_b->create();

$model_a->do_something();
$model_b->do_something();
$model_a->do_something_else();

?>