Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас
Посібники 01 червня 2026

Abstract Factory - сімейства об'єктів

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

Яку проблему вирішує

Інколи об'єкти мають бути узгоджені між собою, а не просто взаємозамінні поодинці. Наприклад, пошта і нотифікації одного хмарного провайдера: не можна випадково змішати поштовий клієнт від AWS і нотифікатор від іншого сервісу. Якщо створювати їх розкидано через new, нічого не гарантує, що вся група належить одному провайдеру.

Як вирішує

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

interface Mailer
{
  public function send(string $to, string $body): void;
}

interface Notifier
{
  public function notify(string $userId, string $message): void;
}

interface ServicesFactory
{
  public function mailer(): Mailer;
  public function notifier(): Notifier;
}

Конкретна фабрика збирає сім'ю одного провайдера:

class SesMailer implements Mailer
{
  public function send(string $to, string $body): void
  {
    // SES send
  }
}

class SesNotifier implements Notifier
{
  public function notify(string $userId, string $message): void
  {
    // SES notify
  }
}

class SesFactory implements ServicesFactory
{
  public function mailer(): Mailer
  {
    return new SesMailer();
  }

  public function notifier(): Notifier
  {
    return new SesNotifier();
  }
}

Клієнт залежить лише від фабрики й інтерфейсів, не знаючи про SES:

class NotificationService
{
  public function __construct(private ServicesFactory $factory) {}

  public function run(): void
  {
    $this->factory->mailer()->send('a@b.com', 'Hello');
    $this->factory->notifier()->notify('user1', 'Hi');
  }
}

Де застосовувати

  • Кілька провайдерів чи конфігурацій, члени яких мусять бути сумісні між собою (хмарні сервіси, теми оформлення, набори драйверів).
  • У Laravel роль абстрактної фабрики часто виконує сервіс-контейнер разом із менеджерами драйверів (Cache, Queue, Mail): метод driver() повертає узгоджену реалізацію за конфігом.

Плюси та мінуси

  • + Гарантує сумісність об'єктів усередині однієї сім'ї.
  • + Ізолює клієнта від конкретних класів - заміна провайдера в одному місці.
  • Додає шар абстракції та класів; новий член сім'ї потребує правок усіх фабрик.
  • Надлишковий, якщо треба замінювати лише один об'єкт, а не цілу сім'ю - тоді достатньо Factory Method або звичайного зв'язування в контейнері.
50

Ця стаття - частина серії

Патерни проєктування

1 / 21

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Вакансії за темою

BINTIME Нова
1 дн. тому

Middle Full Stack Developer (PHP/React)

Middle Full Stack розробник для платформи e-commerce на мікросервісах. 70% PHP (Laravel/Symfony, REST APIs, MySQL/PostgreSQL, Redis), 30% React та Blade шаблони. Потрібно 3+ років досвіду з PHP 8.x, Docker, Git, готовність працювати з AI-інструментами (Claude Code, Cursor, Copilot). Можливість розвитку в AI-інженерингу на production-фічах.

SushiBang Нова
1 дн. тому

Middle Laravel / Filament Developer

Розробка та підтримка кастомної CRM-системи для доставки з використанням Laravel 12, Filament 5 та Livewire. Спеціаліст займатиметься проектуванням бази даних, розробкою модулів прийому/обробки замовлень, інтеграцією через REST API та оптимізацією. Вимагається глибоке розуміння Laravel, Filament та PostgreSQL, досвід з Livewire та SQL-оптимізацією. Важливі автономність і відповідальність.

PulsePaw Нова
2 дн. тому

Junior Strong/Middle PHP developer

Розробник PHP/Laravel для фінтех-проекту на мікросервісній архітектурі. Відповідатиме за підтримку та покращення кодової бази, оптимізацію продуктивності, роботу з MySQL, Redis, черг. Потрібні 2+ роки комерційної розробки, 1+ років PHP (Laravel), розуміння OOP та SOLID, мінімальні знання HTML/CSS/JS.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

27,884 v2.4.8 12 15

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,775 15.33.2 8

Відео за темою