Пристосуванець
Аналогія
Зазвичай у закладах громадського харчування заварюють чай не окремо для кожного клієнта, а відразу в якійсь великій ємності. Це дозволяє економити ресурси: газ/електрику, час і т. д. Шаблон «Пристосуванець» присвячений загальному використанню (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