Skip to main content
Практика завдань

Патерн абстрактна фабрика

Abstract Factory — це креаційний патерн проектування, який надає інтерфейс для створення сімей взаємопов'язаних об'єктів без вказування конкретних класів. Цей патерн особливо корисний, коли ваш код повинен працювати з різними "сім'ями" об'єктів, але залишатися незалежним від конкретних реалізацій.

Ідея:

"Abstract Factory" допомагає створювати продукти, що належать до однієї сім'ї, через спільний інтерфейс, приховуючи деталі реалізації.


Коли застосовувати "Abstract Factory"?

  • Коли програма повинна мати кілька "сімей" продуктів, які використовуються разом. Наприклад, різні теми (Theme) в UI (світла, темна) або різні движки (2D/3D).
  • Коли потрібно створювати об'єкти в залежності від конкретної конфігурації або середовища виконання (наприклад, Web vs. Mobile), але код не повинен залежати від деталей цієї конфігурації.
  • Коли потрібно сховати від клієнта логіку вибору конкретної реалізації, щоб її можна було легко змінити без впливу на решту коду.

Як це працює

1. Визначення сімей продуктів

Спочатку ми визначаємо типи продуктів, які повинні створюватися разом. Наприклад: Button, Checkbox, Modal для різних платформ або тем.

2. Створення абстрактних інтерфейсів

Кожна сім'я продуктів має абстрактні інтерфейси. Наприклад: Button з методом render() та Checkbox з методом toggle().3

3. Реалізація конкретних продуктів

Для кожної платформи (або теми) створюються конкретні класи, які реалізують ці інтерфейси. Наприклад: MacButton, MacCheckbox і WinButton, WinCheckbox.4

4. Абстрактна фабрика

Абстрактна фабрика визначає методи для створення продуктів (наприклад, createButton(), createCheckbox()) і повертає абстрактні типи. Конкретні фабрики (MacFactory, WinFactory) переозначають ці методи, створюючи відповідні об'єкти.

5. Код клієнта

Клієнт працює лише з абстрактною фабрикою та абстрактними продуктами, не прив'язуючись до конкретних реалізацій. Вибір фабрики (Mac vs. Win) може бути налаштований без зміни решти коду.


Приклад (TypeScript)

ts
// 1. Абстрактні інтерфейси продуктів interface Button { render(): void; } interface Checkbox { toggle(): void; } // 2. Конкретні продукти class MacButton implements Button { render(): void { console.log("Mac button rendered"); } } class WinButton implements Button { render(): void { console.log("Windows button rendered"); } } class MacCheckbox implements Checkbox { toggle(): void { console.log("Mac checkbox toggled"); } } class WinCheckbox implements Checkbox { toggle(): void { console.log("Windows checkbox toggled"); } } // 3. Абстрактна фабрика interface GUIFactory { createButton(): Button; createCheckbox(): Checkbox; } // 4. Конкретні фабрики class MacFactory implements GUIFactory { createButton(): Button { return new MacButton(); } createCheckbox(): Checkbox { return new MacCheckbox(); } } class WinFactory implements GUIFactory { createButton(): Button { return new WinButton(); } createCheckbox(): Checkbox { return new WinCheckbox(); } } // 5. Код клієнта function runApp(factory: GUIFactory) { const button = factory.createButton(); button.render(); const checkbox = factory.createCheckbox(); checkbox.toggle(); } // Можна легко замінити фабрику // Mac UI runApp(new MacFactory()); // Windows UI runApp(new WinFactory());

Джерело

Abstract Factory ідеально підходить для великих систем, де є кілька варіантів однієї "сім'ї" продуктів. Це робить код гнучким, дозволяючи замінювати цілі набори об'єктів без зміни основної логіки. Однак, через збільшену кількість класів, цей патерн може бути надмірним, якщо вам лише зрідка потрібно перемикатися між реалізаціями або керувати невеликою кількістю сутностей.

Читати більше про Abstract Factory тут.

Зміст

Коли застосовувати "Abstract Factory"?Як це працюєПриклад (TypeScript)Джерело

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань