Evgenii Legotckoi
Evgenii Legotckoi13 вересня 2018 р. 06:01

Шаблони проектування, що породжують - Абстрактна фабрика

Причини

  • Надання інтерфейсу для створення сімейств пов'язаних чи залежних об'єктів без зазначення їх конкретних класів.
  • Ієрархія, яка інкапсулює: безліч можливих «платформ» та побудова набору «продуктів».
  • Оператор 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 (гнучкіші, складніші), оскільки розробник виявляє, що потрібна більша гнучкість при створенні об'єкта.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах