Flyweight Pattern
同じものは一度しか作らない。
■コード
Item.php
class Item {
private $code;
private $name;
private $price;
public function __construct($code, $name, $price) {
$this->code = $code;
$this->name = $name;
$this->price = $price;
}
}
ItemFactory.php
class ItemFactory {
private $pool;
private static $instance = null;
private function __construct($filename) {
$this->buildPool($filename);
}
public static function getInstance($filename) {
if(!is_null(self::$instance)) {
self::$instance = new ItemFactory($filename);
}
return self::$instance;
}
public function getItem($code) {
if(array_key_exists($code, $this->pool)) {
return $this->pool($code);
}
else {
return null;
}
}
public function buildPool($filename) {
$this->pool = array();
$fh = fopen($filename, 'r');
while($buffer = fgets($fp, 4096)) {
list($itemCode, $itemName, $price) = split("\t", $buffer);
$this->pool[$itemCode] = new Item($itemCode, $itemName, $price);
}
fclose($fh);
}
public final __clone() {
throw new RuntimeException();
}
}
■クライアントコード
$factory = ItemFactory::getInstance('list.dat');
$factory->getItem(123);// 何度コールしても同じインスタンスが返るはず
$factory->getItem(456);//
$factory->getItem(789);//
Singletonをまとめた感じだ。
TrackBack URL :
Comments (0)