Factory Pattern

Паттерн Фабрика для создания объектов без указания конкретных классов

Паттерн Фабрика (Factory Pattern) предоставляет интерфейс для создания объектов без указания их конкретных классов. Фабрика инкапсулирует логику создания объектов, что упрощает добавление новых типов и изменяет процесс создания в одном месте. Это особенно полезно, когда процесс создания объекта сложный или когда нужно создавать объекты на основе условий или параметров.

В примере ниже CoffeeFactory создает различные типы кофе, скрывая детали их создания. Клиентский код использует фабрику для получения объектов, не зная точных параметров конструктора. Это упрощает добавление новых типов кофе и централизует логику создания.

class Coffee {
  constructor(kind, price, volume) {
    this.kind = kind;
    this.price = price;
    this.volume = volume;
  }

  getInfo() {
    return `${this.kind}: ${this.volume}L, $${this.price}`;
  }
}

class CoffeeFactory {
  create(type) {
    switch (type) {
      case 'cappuccino':
        return new Coffee('cappuccino', 5, 0.2);
      case 'latte':
        return new Coffee('latte', 6, 0.3);
      case 'americano':
        return new Coffee('americano', 2, 0.5);
      case 'espresso':
        return new Coffee('espresso', 3, 0.1);
      default:
        throw new Error(`Unknown coffee type: ${type}`);
    }
  }
}

// Примеры использования
const factory = new CoffeeFactory();

const cappuccino = factory.create('cappuccino');
console.log(cappuccino.getInfo()); // "cappuccino: 0.2L, $5"

const latte = factory.create('latte');
console.log(latte.getInfo()); // "latte: 0.3L, $6"

const americano = factory.create('americano');
console.log(americano.getInfo()); // "americano: 0.5L, $2"

// Создание массива кофе
const orders = ['cappuccino', 'latte', 'americano', 'espresso'];
const coffees = orders.map(type => factory.create(type));
coffees.forEach(coffee => console.log(coffee.getInfo()));