PHP でデザインパターン (Flyweight)
PHP デザインパターン
Published: 2018-10-20

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));

参考