- 1. Причини
- 2. Проблеми
- 3. Обговорення
- 4. Структура
- 5. Приклад
- 6. Контрольний список
- 7. Емпіричні правила
Причини
- Надання інтерфейсу для створення сімейств пов'язаних чи залежних об'єктів без зазначення їх конкретних класів.
- Ієрархія, яка інкапсулює: безліч можливих «платформ» та побудова набору «продуктів».
- Оператор new вважається шкідливим.
Проблеми
Якщо програма має бути портативною, їй необхідно інкапсулювати всі залежності цільової платформи. Ці «платформи» можуть включати: систему вікон, операційну систему, базу даних і т. д. Занадто часто ця інкапсуляція не розробляється заздалегідь, і безліч операторів case або різних #ifdef з параметрами для всіх платформ, що підтримуються в даний час, починають розмножуватися подібно кроликам по всьому коду.
Обговорення
Забезпечення рівня абстракції, який абстрагує створення сімейств пов'язаних чи залежних об'єктів без прямої вказівки їх конкретних класів. Об'єкт «фабрика» відповідає за надання послуг зі створення всього сімейства класів всіх підтримуваних платформ. Клієнти ніколи не створюють об'єкти платформи безпосередньо, вони просять завод зробити це для них.
Цей механізм спрощує зміна сімейства об'єктів класів, що породжуються, оскільки конкретний клас фабричного об'єкта з'являється тільки один раз у додатку - там, де він створюється. Додаток може надавати можливості зміни всього сімейства об'єктів, що породжуються, просто створюючи екземпляр іншого конкретного екземпляра абстрактної фабрики.
Оскільки сервіс, що надається фабричний об'єкт, настільки поширений, він зазвичай реалізується як Singleton. Або може реалізуватися з допомогою статичних методів класу у разі з мовою програмування C++.
Структура
Абстрактна фабрика визначає фабричний метод для кожного об'єкта, що породжується. Кожен фабричний метод інкапсулює оператор new та конкретні, специфічні для платформи класи. Кожна платформа потім моделюється похідним класом Factory.
Приклад
Метою абстрактної фабрики є надання інтерфейсу для створення сімейств пов'язаних об'єктів без зазначення конкретних класів. Ця модель може бути знайдена в обладнанні для штампування листового металу, що використовується для виготовлення автомобілів. Устаткування для штампування – це абстрактна фабрика, яка створює автозапчастини. Той самий механізм використовується для штампування дверей з правого боку, лівих дверей, правих передніх крил, лівих передніх крил, витяжок тощо для різних моделей автомобілів. Завдяки використанню роликів для зміни штампувальних шаблонів конкретні класи, що випускаються машиною, можуть бути змінені протягом декількох хвилин.
Контрольний список
- Вирішіть, чи є «незалежність платформи» та сервіси створення іточником проблем у вашому програмному коді.
- Виведіть матрицю з «платформ» та «продуктів». Для якої платформи, які класи потрібні.
- Визначте фабричний інтерфейс, який складається з фабричного методу для кожного об'єкта, що породжується.
- Визначте виробничий клас для кожної платформи, яка інкапсулює всі посилання на оператор new.
- Клієнт повинен видалити всі посилання на new і використовувати фабричні методи для створення об'єктів, що породжуються.
Емпіричні правила
- Іноді шаблони, що породжують конкурують: бувають випадки, коли або шаблон Прототип (Prototype), або Абстрактна фабрика (Abstract Factory) можуть використовуватися з успіхом. В інших випадках вони доповнюють один одного: Abstract Factory може зберігати набір прототипів, з яких можна клонувати та повертати об'єкти. Builder може використовувати один із інших шаблонів для реалізації компонентів, які будуть створені. Abstract Factory, Builder та Prototype можуть використовувати Singleton у своїй реалізації.
- Abstract Factory, Builder і Prototype визначають фабричний об'єкт, який відповідає за створення класу об'єктів, що породжуються і робить його параметром системи. Абстрактна фабрика має фабричний об'єкт чи метод, що виробляє об'єкти кількох класів. Builder має фабричний об'єкт, який створює складний продукт поступово, використовуючи відповідний складний протокол. Прототип має фабричний об'єкт (він прототип), що створює продукт, копіюючи об'єкт-прототип.
- Абстрактні класи Factory часто реалізуються за допомогою Factory Methods, але вони також можуть бути реалізовані за допомогою Prototype.
- Абстрактну фабрику можна використовувати як альтернативу Facade для приховання класів, специфічних для платформи.
- Builder фокусується на побудові складного об'єкта крок за кроком. Абстрактна фабрика підкреслює сімейство об'єктів продукту (простих чи складних). Builder повертає продукт як останній крок, але, що стосується абстрактної фабрики, продукт негайно повертається.
- Часто проекти починаються з використання Factory Method (менш складні, налаштовані, підкласи розмножуються) і розвиваються в напрямку Abstract Factory, Prototype або Builder (гнучкіші, складніші), оскільки розробник виявляє, що потрібна більша гнучкість при створенні об'єкта.