Пристосуванець

Аналогія

Зазвичай у закладах громадського харчування заварюють чай не окремо для кожного клієнта, а відразу в якійсь великій ємності. Це дозволяє економити ресурси: газ/електрику, час і т. д. Шаблон «Пристосуванець» присвячений загальному використанню (sharing).

Стисло

Шаблон застосовується для мінімізації використання пам'яті чи обчислювальної вартості рахунок загального використання якомога більшої кількості однакових об'єктів.

Вікіпедія

«Пристосуванець» — це об'єкт, який мінімізує використання пам'яті за рахунок спільного з іншими, такими ж об'єктами використання якомога більшого обсягу даних. Це спосіб застосування численних об'єктів, коли просте уявлення, що повторюється, призведе до неприйнятного споживання пам'яті.

Приклад

Зробимо типи чаю та чайника.

// Пристосуванець - те, що буде закешовані.
// Типи чаю тут - пристосуванці.
class KarakTea
{
}

// Діє як фабрика та економить чай
class TeaMaker
{
    protected $availableTea = [];

    public function make($preference)
    {
        if (empty($this->availableTea[$preference])) {
            $this->availableTea[$preference] = новий KarakTea();
        }

        return $this->availableTea[$preference];
    }
}

Зробимо забігайлівку TeaShop, яка приймає та обробляє замовлення:

class TeaShop
{
    protected $orders;
    protected $teaMaker;

    public function __construct(TeaMaker $teaMaker)
    {
        $this->teaMaker = $teaMaker;
    }

    public function takeOrder(string $teaType, int $table)
    {
        $this->orders[$table] = $this->teaMaker->make($teaType);
    }

    public function serve()
    {
        foreach ($this->orders as $table => $tea) {
            echo "Serving tea to table#". $table;
        }
    }
}

Використання:

$teaMaker = новий TeaMaker();
$shop = новий TeaShop($teaMaker);

$shop->takeOrder('less sugar', 1);
$shop->takeOrder('more milk', 2);
$shop->takeOrder('without sugar', 5);

$shop->serve();
// Serving tea to table# 1
// Serving tea to table# 2
// Serving tea to table# 5