Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Функція-фабрика». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Функція-фабрика** - це функція, яка повертає інші функції, "виробляючи" їх за заданими параметрами. Вона використовується для створення замикань і повторного використання логіки, часто зберігаючи власний стан у кожній згенерованій функції. **Ключове:** фабрика генерує функції зі спільним шаблоном, використовуючи замикання для інкапсуляції стану.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**функція-фабрика (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] Щось пішло не так ``` Один шаблон -> різні функції, різні контексти. --- ## Підсумок | Властивість | Опис | |---|---| | Що це | Функція, яка повертає іншу функцію | | Основна ідея | "Генерувати" функції із спільним шаблоном | | Часто використовує | Замикання | | Де застосовується | Конфігурації, обробники, логери, лічильники, фабричні патерни | | Переваги | Менше повторів, більше гнучкості й читабельності |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.