Коротка відповідь
middleFactory Method — це патерн, що інкапсулює створення об’єктів через абстрактний метод `create()`, дозволяючи підкласам вирішувати, який клас інстанціювати. У TS це виглядає як абстрактний фабричний клас з методом `create(): Product` і конкретними реалізаціями, що повертають різні продукти. Наприклад: `class CarFactory { create(): Car { return new Sedan(); } }`
Повне пояснення
1. Що це і навіщо
Factory Method – патерн створення, що дозволяє класу делегувати створення об’єктів підкласам. Це зменшує зв’язок між кодом, що використовує об’єкт, і конкретним класом цього об’єкта.
2. Принцип роботи / алгоритм
Клас‑контекст (наприклад, VehicleService) викликає абстрактний метод create(). Підклас (наприклад, CarFactory) реалізує цей метод і повертає конкретний продукт (Sedan, SUV). Діаграма: Context → Factory Method → ConcreteFactory → Product.
3. Реалізація (JS / TS)
- Базова реалізація
abstract class Product { abstract use(): void; }
class ConcreteProductA extends Product { use() { console.log('A'); } }
abstract class Creator { abstract create(): Product; }
class ConcreteCreator extends Creator { create() { return new ConcreteProductA(); } }
- Веб‑dev приклад – створення різних видів кнопок у UI
interface Button { render(): void; }
class PrimaryButton implements Button { render() { /* ... */ } }
class SecondaryButton implements Button { render() { /* ... */ } }
abstract class ButtonFactory { abstract create(): Button; }
class PrimaryButtonFactory extends ButtonFactory { create() { return new PrimaryButton(); } }
- Новачковий приклад – генерація логів
abstract class Logger { abstract log(msg: string): void; }
class ConsoleLogger extends Logger { log(msg) { console.log(msg); } }
abstract class LoggerFactory { abstract create(): Logger; }
class ConsoleLoggerFactory extends LoggerFactory { create() { return new ConsoleLogger(); } }
4. Тестування (Jest або Vitest)
test('Factory creates correct product', () => {
const factory = new ConcreteCreator();
const prod = factory.create();
expect(prod).toBeInstanceOf(ConcreteProductA);
});
5. Проблеми та edge cases
- Неправильне використання ролей – виклик
create()у базовому класі замість підкласу. - Зайва абстракція – коли фабрика створює лише один тип продукту.
- Cyclical dependencies – фабрика залежить від конкретного продукту, а продукт залежить від фабрики.
- Плутанина між Factory Method і Abstract Factory – перший створює один продукт, другий групу.
- Performance‑пастки – надмірна кількість фабрик у micro‑service архітектурі.
6. Оптимізація та продуктивність
Фабрика додає один рівень абстракції, що незначно збільшує час створення об’єкта. Пам’ять витрачається лише на реальні інстанції продукту.
7. Без JS / архітектурні альтернативи
У чистій HTML/CSS можна використовувати шаблони (template tags) і JavaScript‑фабрики для створення елементів. У backend без патерна – просто викликати конструктор класу.
8. Cheatsheet + follow-up
- Cheatsheet:
Creator → create() → Product. Підклас реалізуєcreate(). - Interview Q1: Яка різниця між Factory Method і Abstract Factory?
- Interview Q2: Як уникнути циклічних залежностей у фабриці?