Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/25

counter hits
since 1999/11/06


PHP4でデザインパターン(Factory Method編)

zip形式 tgz形式

オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。

caution間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m

今回は、Factory Methodパターンで、「何を作るか具体的な内容はサブクラスに任せる」パターンです(以下のクラス図を参照)。

Factory Methodパターンのクラス図

今回のサンプルは、ユーザーデータを格納するオブジェクトをCreatorから得るというもので、上のクラス図との関係は、

  • Product => Product
  • ConcreteProduct => User
  • Creator => Factory
  • ConcreteCreator => UserFactory

となります。なお、Factoryを継承するUserFactoryクラスには、Singletonパターンも含まれています。

ということで、以下がサンプルコードです。また、Abstractクラスなどを含めたスクリプトコードは、上のリンクからダウンロードできます。Factory Methodの利点は、Creatorを変更することなく、色々なProductを作成できることですので、色々なProduct、Creatorの具象クラスを作ってみてください。

あ。Factory Methodって、Template Methodパターンが含まれてる(というか典型例)って、気付きました?Creatorの部分ですね。

●FactoryMethod.php

<?php
require_once("jp/ne/hi_ho/pat/dimension/Abstract.phl");
?>
<?php
/**
 * interface的な位置づけ
 */
class Product
{
}

/**
 * Productを作る工場
 */
class Factory
{
    /**
     * このメソッドでProductを得る
     */
    function create($code, $name)
    {
        return $this->createProduct($code, $name);
    }

    /**
     * サブクラスで実装することで、Productを変えることができる
     */
    function createProduct($code, $name) { Abstract::set("createProduct"); }
}

/**
 * ユーザーを表すクラス。Productの具象クラス
 */
class User extends Product
{
    var $code_;
    var $name_;
    function User($code, $name)
    {
        $this->code_ = $code;
        $this->name_ = $name;
    }
    function getCode() { return $this->code_; }
    function getName() { return $this->name_; }
}

/**
 * ユーザーオブジェクトを返すFactoryの具象クラス。
 * 今回はSingletonパターンにもなっている
 */
class UserFactory extends Factory
{
    function &getInstance()
    {
        static $singleton_;
        if (!isset($singleton_)) {
            $singleton_ = new UserFactory();
        }
        return $singleton_;
    }

    function createProduct($code, $name)
    {
        return new User($code, $name);
    }
}
?>
<?php
    /**
     * main
     */
    $fac =& UserFactory::getInstance();
    $users = array($fac->create("01", "下岡"),
                   $fac->create("10", "広島県人@埼玉在住"),
                   $fac->create("99", "ほげほげ"));
    for ($i = 0; $i < count($users); $i++) {
        printf("%s => %s<br>", $users[$i]->getCode(),
                                  $users[$i]->getName());
    }
?>

●出力結果
01 => 下岡
10 => 広島県人@埼玉在住
99 => ほげほげ

また、XSLTラッパークラスでは、XSLTProcessor・XSLTLogHandlerの各インスタンスを得る部分がFactory Method(もどき?)になっています。この場合、Creatorに相当するクラスがなく、ConcreteCreatorを直接書いています。XSLTProcessorを例に取ると、上記クラス図との関係は、

  • Product => XSLTProcessor
  • ConcreteProduct => XSLTProcessor40、XSLTProcessor41
  • Creator => なし
  • ConcreteCreator => XSLTProcessorFactory

となっています。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.