|
zip形式
tgz形式
オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。
間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m
今回は、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
class Product
{
}
class Factory
{
function create($code, $name)
{
return $this->createProduct($code, $name);
}
function createProduct($code, $name) { Abstract::set("createProduct"); }
}
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_; }
}
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
$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
となっています。
|