Skip to main content

Функція-фабрика

функція-фабрика (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

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