Паттерн Фабрика (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()));