Функція-фабрика
функція-фабрика (function factory) - це функція, яка повертає інші функції. Тобто вона "виробляє" нові функції за заданими параметрами - звідси й назва "фабрика".
Визначення простими словами
Функція-фабрика - це функція, яка під час виклику створює і повертає нову функцію, часто з певною поведінкою, заснованою на передаваних аргументах.
Вона використовується для створення замикань і повторного використання логіки.
Приклад 1 - проста фабрика привітань
javascript
function createGreeter(greeting) {
return function(name) {
console.log(`${greeting}, ${name}!`);
};
}
const sayHi = createGreeter('Привіт');
const sayBye = createGreeter('Бувай');
sayHi('Alice'); // Привіт, Alice!
sayBye('Maria'); // Бувай, Maria!Тут:
createGreeter- фабрика;sayHiіsayBye- функції, "вироблені" цією фабрикою;- Кожна нова функція замикає своє значення
greeting.
Приклад 2 - фабрика лічильників
javascript
function createCounter(start = 0) {
let count = start;
return function() {
count++;
return count;
};
}
const counterA = createCounter();
const counterB = createCounter(10);
console.log(counterA()); // 1
console.log(counterA()); // 2
console.log(counterB()); // 11Кожна функція-лічильник має своє власне замикання і зберігає незалежний стан.
Приклад 3 - фабрика фільтрів
javascript
function createFilter(minValue) {
return function(numbers) {
return numbers.filter(n => n >= minValue);
};
}
const filterAbove10 = createFilter(10);
console.log(filterAbove10([5, 8, 13, 21])); // [13, 21]Фабрика створює різні фільтри, не повторюючи той самий код.
Приклад 4 - фабрика з частковим застосуванням (partial application)
javascript
function multiplyBy(factor) {
return function(number) {
return number * factor;
};
}
const double = multiplyBy(2);
const triple = multiplyBy(3);
console.log(double(5)); // 10
console.log(triple(5)); // 15Зручно для створення спеціалізованих функцій "на льоту".
Чому це зручно
| Перевага | Опис |
|---|---|
| Повторне використання коду | Фабрика створює безліч схожих функцій без дублювання логіки |
| Інкапсуляція даних | Використовує замикання, щоб зберігати внутрішній стан |
| Гнучкість | Можна створювати функції з динамічною поведінкою |
| Функціональний стиль | Добре поєднується з патернами "map / filter / reduce" |
Приклад 5 - реальний випадок (логер)
javascript
function createLogger(prefix) {
return function(message) {
console.log(`[${prefix}] ${message}`);
};
}
const info = createLogger('INFO');
const error = createLogger('ERROR');
info('Сервер запущено'); // [INFO] Сервер запущено
error('Щось пішло не так'); // [ERROR] Щось пішло не такОдин шаблон -> різні функції, різні контексти.
Підсумок
| Властивість | Опис |
|---|---|
| Що це | Функція, яка повертає іншу функцію |
| Основна ідея | "Генерувати" функції із спільним шаблоном |
| Часто використовує | Замикання |
| Де застосовується | Конфігурації, обробники, логери, лічильники, фабричні патерни |
| Переваги | Менше повторів, більше гнучкості й читабельності |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.