2010/03/07

[PHP, デザインパターン] Factory Method パターン を作ってみる

デザインパターン第2弾は

Factory Method パターン(ファクトリメソッド・パターンとは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 Factory Method パターンは、オブジェクトの生成をサブクラスに委ねることによって、プログラム内で使用されるインスタンスの型の制約を緩めることを目的とする。

Virtual Constructor パターンとも呼ばれる。 /via wikipedia
実際に  Factory Method パターン を使う機会ってのは結構あると思うんだけど、
どうもこの説明とちがった実装のしかたをするのが多いみたい。
それって  Factory Method パターンとは言わないのかな??


よく Factory Method パターン で見るのは PEAR の Pager 。
いい加減 PHP5 になって strict standards が出なくなってほしい PEAR Pager 。
最近は Zend_Paginator 使うからいいっちゃいいんだけど・・・・。

<?php
class Factory
{
    const TYPE_RAMEN = 'Ramen';
    const TYPE_SOBA  = 'Soba';

    public static function create($type = null)
    {   
        $noodle = null;
        switch ($type) {
            case self:: TYPE_RAMEN:
            case self:: TYPE_SOBA:
                $noodle = new $type();
                break;
            default:
                throw new Exception('そんな麺ないし。');
                break;
        }   

        return $noodle;
    }   
}

abstract class Product
{
    abstract public function madeFrom();
}   

class Ramen extends Product
{
    public function madeFrom()
    {   
        return 'コムギコカナニカダ';
    }
}
class Soba extends Product
{
    public function madeFrom()
    {
        return 'そば粉';
    }
}

$noodle = Factory::create(Factory::TYPE_RAMEN);
echo $noodle->madeFrom();
                         

こんな感じ??
Wikipedia のサンプルが Gof のとおりなんだろうけど、
よく使うのはこんな感じになるとおもう。
製品生成工場にはなってると思うんだけど、
これも Factory Method パターン って呼べるのかはちょっと自信がない・・・・。

教えてエロいひと。