суббота, 19 июля 2025 г.

Abstract Factory

Abstract Factory, 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

Абстрактная фабрика — это порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.

1. Суть паттерна

Паттерн «Абстрактная фабрика» — это порождающий шаблон проектирования,

который предоставляет интерфейс для создания целых семейств связанных или зависящих друг от друга объектов,

не специфицируя их конкретные классы.

Другими словами,

он позволяет создавать наборы родственных объектов, придерживаясь единого подхода к созданию,

но при этом оставаясь гибким к появлению новых вариантов семейств.

Главная цель паттерна — отделение процесса создания семейства объектов от их использования,

что позволяет легко менять целый набор объектов при сохранении общей логики программы.

2. Когда использовать?

Паттерн «Абстрактная фабрика» применяют в следующих случаях:

  • Необходимо создавать несколько семейств взаимосвязанных объектов,
  • причем объекты одного семейства должны работать вместе,
  • но не смешиваться с объектами другого семейства.
  • Требуется обеспечить возможность замены целого семейства объектов без изменения клиентского кода.
  • Семьи объектов определяются четко,
  • и замена одного семейства на другое возможна на этапе конфигурирования или выполнения программы.

Паттерн «Абстрактная фабрика» стоит использовать в следующих ситуациях:

1. Когда нужно создать семейство взаимосвязанных объектов

Часто в программах возникают ситуации, когда объекты образуют целые группы или семейства, тесно связанные друг с другом.

Например, UI-интерфейс с темой оформления (светлая тема vs. тёмная тема),

драйверы для работы с разными типами оборудования (Windows vs. Linux),

сервисы интеграции с разными поставщиками услуг (Google Cloud Storage vs. Amazon S3).

В таких случаях создание каждого объекта индивидуально привело бы к сильному

увеличению сложности и сильно связано бы клиентский код с конкретными реализациями.

Паттерн «Абстрактная фабрика» позволяет свести это к минимуму,

предоставляя единую точку входа для создания всех необходимых объектов семейства.

2. Когда требуется сменить целую группу объектов без изменения клиентского кода

Одним из ключевых достоинств паттерна является возможность полного изменения семейства объектов без необходимости

переписывать существующий клиентский код.

Например, если в вашем приложении внезапно понадобится перейти с SQLite на PostgreSQL или сменить дизайн UI-интерфейса,

паттерн «Абстрактная фабрика» позволит легко это сделать,

поменяв всего лишь тип фабрики, который используется в программе.

3. Когда объекты связаны общим назначением, но различаются внешне

Если у вас есть группа объектов, которые выполняют сходные функции, но выглядят или

ведут себя иначе в зависимости от внешних факторов (операционной системы,

конфигурации среды, предпочтений пользователя и т.д.),

паттерн «Абстрактная фабрика» даст вам возможность группировать подобные объекты в логически обоснованные семейства.

Например, в графическом интерфейсе пользователь может видеть одинаковые элементы (полосы прокрутки, кнопки, таблицы),

но их внешний вид и поведение зависят от выбранной темы (OS X, Windows, Material Design и т.д.).

Каждая тема —

это отдельное семейство, и абстрактная фабрика позволит выбирать подходящую тему без вмешательства в логику программы.

4. Когда появляются потенциальные комбинации семейств объектов

По мере роста проекта разнообразие комбинаций типов объектов возрастает.

Например, при работе с драйверами устройств или интеграцией с различными провайдерами облачных сервисов,

у вас может появиться потребность создать разные сочетания драйверов и провайдеров

(например, Windows с Google Cloud, Linux с AWS).

Паттерн «Абстрактная фабрика» позволяет удобно формировать эти комбинации, предоставляя удобные фабрики для каждого случая.

5. Когда приоритетна слабая связанность и высокая расширяемость

Одной из сильных сторон паттерна «Абстрактная фабрика» является слабая связанность между клиентом и конкретными классами объектов.

Клиент взаимодействует только с абстрактной фабрикой, а значит,

любые изменения внутри семейств объектов останутся локальными и не коснутся клиентского кода.

Такой подход делает систему легко расширяемой:

добавление новых семейств объектов выполняется простым добавлением новой фабрики и соответствующей реализации объектов,

не затрагивая старый код.

Пример использования:

Допустим, у вас есть приложение, которое работает с несколькими видами документов (PDF, Word, Excel)

и вам нужно поддерживать печать документов в двух вариантах оформления (цветной и черно-белый).

В этом случае можно использовать абстрактную фабрику для создания семейств объектов печати:

  • Черно-белая фабрика: печатает PDF, Word и Excel в чёрно-белом режиме.
  • Цветная фабрика: печатает те же документы, но в цвете.

Таким образом, ваш клиентский код останется компактным и лаконичным,

и в будущем вы сможете легко добавить новые виды документов или способов печати, изменяя только фабрику.

Итог:

Паттерн «Абстрактная фабрика» идеален,

когда речь идет о создании целой группы взаимосвязанных объектов,

разделенных на логические семейства, и когда важен высокий уровень гибкости и легкости

в замене целых семейств объектов без существенных изменений в клиентском коде.

Комментариев нет:

Отправить комментарий