[[デザインパターン]]

*Template Method [#vad6c5e6]

これはデザインパターンというより、普通のテクニックという感じです。
理論とか無視してざっくばらんに言ってしまえば「だぶってるところを共通化しようぜ!」というものです。

論よりコード!Webアプリを想定してます!
 <?php
 abstrat class Page{
     public function putHtml(){//HTML出力する
          $this->putHeader();
         $this->putBody();
         $this->putFooter();
     }
     private function putHeader(){
         //CSSの読み込みとか、metaタグとかのヘッダー出力
     }
     protected function putFooter(){
         //作った人のメアドとかフッター    
     }
     abstract protected function putBody();//ページによって異なる
 }
 
 class TopPage extends Page{
     protected function putBody(){
         //トップページの内容が出力されるのだろう!
     }
 }
 class ProfilePage extends Page{
     protected function putBody(){
        //プロフィールが出力されたりするんでしょう! 
     }
 }
 ?>

コード見た上で言えば、「共通してる部分を抜きだして抽象クラスに実装しろ」ということになります。
理論的に言えば、処理の雛形(言いかえると、処理の手順を定めたもの)を作って、処理の詳細(putBody()とかですね)を派生クラスで実装しろというものです。Templateの日本語訳は雛形!

**いつ使うのか [#z3cfcc97]
関数での共通化をしっかりやったプログラマーさんならいつの間にか適用しているようなデザインパターンです。適用のタイミングもだいたい同じです。
ただ、むやみに「共通化するぜ!!!」とやりまくると後々悲惨なことになるので、クラスたちの性質を考えて抽象クラスは作る必要があります。これはどっちかっていうとOOPの継承における問題の話題なのでそちらに。。