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(); ?>