Abstract Factory, Example, Giga, Path
https://refactoring.guru/ru/design-patterns/abstract-factory
https://giga.chat/link/gcsUUyXJCB
D:\VC25\Otus\Py\projects\des_patterns\2_abstarct_factory
Цели нашего примера:
Мы решили продемонстрировать,
как паттерн «Абстрактная фабрика» позволяет создавать целостные наборы объектов,
относящихся к определенной тематике (семейству), и гарантирует,
что объекты из одного семейства соответствуют друг другу.
Задача:
Нам нужно создать интерфейс (UI),
который поддерживает две темы оформления: светлую и тёмную.
Наша задача — спроектировать такую систему, чтобы можно было легко переключаться между темами,
при этом сохранив логичность и консистентность каждого элемента (например, кнопка, чекбокс и текстовое поле) в рамках выбранной темы.
Как мы подошли к решению:
Мы использовали паттерн «Абстрактная фабрика», потому что:
- Нам нужно создавать целые наборы элементов интерфейса, а не единичные объекты.
- Важно, чтобы элементы из одного набора соответствовали друг другу визуально и стилистически.
- Должна быть возможность легко переключаться между наборами (темами), без необходимости изменять клиентский код.
Какие этапы мы выполнили:
- Определение абстрактных интерфейсов:
- Мы определили абстрактный класс для UI-элементов (
AbstractUIElement), - который обязывает все реальные элементы интерфейса (кнопки, чекбоксы,
- текстовые поля) реализовать метод
render. - Также мы определили абстрактную фабрику (
AbstractUIFactory), которая обязана создавать полный набор элементов (кнопку, - чекбокс и текстовое поле).
- Мы определили абстрактный класс для UI-элементов (
- Создание конкретных реализаций:
- Далее мы создали конкретные классы элементов интерфейса для каждой темы (светлые и темные версии).
- Затем мы разработали конкретные фабрики (
LightUIFactoryиDarkUIFactory), каждая из которых способна создать набор элементов, - соответствующий своей теме.
- Организация взаимодействия:
- Наш клиентский код (функция
ui_elements_demo) принимает любую фабрику и вызывает методы фабрики для создания элементов. - По сути, клиентский код не знает, какую именно тему он получит — он просто просит у фабрики создать элементы и вызывает их методы.
- Наш клиентский код (функция
Что получилось в результате:
- Модульность и расширение:
- Весь код аккуратно разделён на части, и любая дополнительная тема (например,
- третья — красная тема или зелёная) может быть легко добавлена путём создания новой фабрики и новых классов элементов.
- Независимость от конкретного типа:
- Нет никакой зависимости между элементами одной темы и клиентским кодом.
- Переключиться на другую тему можно просто сменив фабрику.
- Корректность взаимодействия:
- Элементы из одного семейства гарантированно сочетаются друг с другом.
- Нельзя случайно смешать светлые и тёмные элементы,
- так как каждая фабрика создаёт однородный набор.
Итоговый вывод:
Наш пример наглядно показал,
как паттерн «Абстрактная фабрика» позволяет создавать целостные наборы объектов,
организованных по общему признаку (тема оформления).
Благодаря такому подходу наше приложение стало легко настраиваемым и расширяемым,
позволяя добавлять новые темы без изменения существующего кода.
- Проверка правильность размещения файлов и отсутствие конфликтов имен.
- Можно развить идею, добавив третью тему или новый тип элемента интерфейса.
- Расширении функциональных возможностей элементов (например, добавить анимацию, интерактивность).
Комментариев нет:
Отправить комментарий