Flyweight パターンのメリット
一度インスタンス化したオブジェクトを使い回し、生成されるオブジェクトの数やリソースの消費を抑えます
Flyweightパターンでは、メモリ以外のリソースも節約することができます。たとえば、インスタンスを生成する時間がそうです。インスタンスを生成することは、非常に時間がかかる処理の1つです。
実装例
<?php
class Item
{
private $code;
private $name;
private $price;
public function __construct($code, $name, $price)
{
$this->code = $code;
$this->name = $name;
$this->price = $price;
}
public function getCode()
{
return $this->code;
}
public function getName()
{
return $this->name;
}
public function getPrice()
{
return $this->price;
}
}
class ItemFactory
{
const DATA = [
['ITEM_CODE_001', 'ITEM_NAME_001', 3800],
['ITEM_CODE_002', 'ITEM_NAME_002', 1500],
['ITEM_CODE_003', 'ITEM_NAME_003', 800],
];
private $pool;
private static $instance = null;
private function __construct()
{
$this->buildPool();
}
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new ItemFactory();
}
return self::$instance;
}
public function getItem($code)
{
if (array_key_exists($code, $this->pool)) {
return $this->pool[$code];
}
return null;
}
public function buildPool()
{
$this->pool = [];
foreach (self::DATA as $row) {
$item = new Item($row[0], $row[1], $row[2]);
$this->pool[$row[0]] = $item;
}
}
public final function __clone()
{
throw new RuntimeException();
}
}
$factory = ItemFactory::getInstance();
$items = [];
$items[] = $factory->getItem('ITEM_CODE_001');
$items[] = $factory->getItem('ITEM_CODE_002');
$items[] = $factory->getItem('ITEM_CODE_003');
// true
var_dump($items[0] === $factory->getItem('ITEM_CODE_001'));
// false
var_dump($items[0] === new Item('ITEM_CODE_001', 'ITEM_NAME_001', 3800));