Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке патерн Abstract Factory?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Abstract Factory (Абстрактна фабрика)** - це породжувальний патерн проєктування, який дозволяє створювати сімейства взаємопов'язаних об'єктів без вказівки їхніх конкретних класів. **Ключове:** Abstract Factory створює цілі набори пов'язаних об'єктів (а не один, як Factory Method), забезпечуючи їхню узгодженість і легке перемикання між сімействами продуктів.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Abstract Factory (Абстрактна фабрика)** - це **породжувальний патерн проєктування**, який дозволяє створювати **сімейства взаємопов'язаних об'єктів** без вказівки їхніх конкретних класів. --- ### 1. **Основна ідея** Якщо в системі є кілька груп пов'язаних продуктів (наприклад, інтерфейс для Windows і для macOS), то Abstract Factory надає **єдиний інтерфейс**, через який можна створювати сумісні об'єкти для кожної групи. Клієнт при цьому не знає, **які саме класи створюються** - він працює лише з абстракціями. --- ### 2. **Коли використовується** - Коли потрібно забезпечити **сумісність** створюваних об'єктів (наприклад, кнопка, вікно і меню мають належати одній платформі). - Коли система має бути **незалежна від конкретних класів**, з якими працює. - Коли потрібно легко **перемикати сімейства продуктів** (наприклад, з теми «світла» на «темну»). --- ### 3. **Структура** 1. **AbstractFactory** - оголошує інтерфейс створення об'єктів різних типів. 2. **ConcreteFactory** - реалізує інтерфейс і створює конкретні продукти. 3. **AbstractProductA/B** - інтерфейси окремих продуктів. 4. **ConcreteProductA/B** - конкретні реалізації. 5. **Client** - використовує лише абстрактні інтерфейси, не знаючи конкретних класів. --- ### 4. **Приклад (Java)** ```java // Абстрактні продукти interface Button { void paint(); } interface Checkbox { void paint(); } // Конкретні продукти class WinButton implements Button { public void paint() { System.out.println("Windows Button"); } } class MacButton implements Button { public void paint() { System.out.println("Mac Button"); } } // Абстрактна фабрика interface GUIFactory { Button createButton(); Checkbox createCheckbox(); } // Конкретні фабрики class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); } public Checkbox createCheckbox() { return new WinCheckbox(); } } class MacFactory implements GUIFactory { public Button createButton() { return new MacButton(); } public Checkbox createCheckbox() { return new MacCheckbox(); } } ``` --- ### 5. **Переваги** - Гарантує **сумісність** продуктів усередині одного сімейства. - Ізолює клієнтський код від конкретних класів. - Полегшує додавання нових сімейств продуктів. --- ### 6. **Недоліки** - Додавання нового типу продукту вимагає зміни інтерфейсу всіх фабрик (порушує OCP). - Збільшує кількість класів і абстракцій. --- **Підсумок:** Abstract Factory створює **цілі набори пов'язаних об'єктів** (а не один, як Factory Method), забезпечуючи їхню узгодженість і легке перемикання між сімействами продуктів.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.