Проста Фабрика (Simple Factory)

Аналогія

Допустимо, ви будуєте будинок і вам потрібні двері. Буде бардак, якщо кожен раз, коли вам потрібні двері, ви станете озброюватися інструментами і робити їх на будмайданчику. Натомість ви замовите двері на фабриці.

Коротко

Проста фабрика просто генерує екземпляр для клієнта без надання будь-якої логіки екземпляра.

Вікіпедія

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

Приклад

Для початку нам потрібен інтерфейс дверей та його реалізація.

interface Door
{
    public function getWidth(): float;
    public function getHeight(): float;
}

class WoodenDoor implements Door
{
    protected $width;
    protected $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    public function getWidth(): float
    {
        return $this->width;
    }

    public function getHeight(): float
    {
        return $this->height;
    }
}

Тепер спорудимо фабрику дверей, яка створює та повертає нам двері.

class DoorFactory
{
    public static function makeDoor($width, $height): Door
    {
        return new WoodenDoor($width, $height);
    }
}

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

$ door = DoorFactory: makeDoor (100, 200);
echo 'Width:'. $door->getWidth();
echo 'Height: '. $door->getHeight();

Коли використовувати?

Коли створення об'єкта має на увазі якусь логіку, а не просто кілька привласнень, то має сенс делегувати завдання виділеній фабриці, а не повторювати всюди один і той самий код.