Паттерн: Абстрактная фабрика (Abstract Factory)
1️⃣ Как кратко ответить
Абстрактная фабрика — это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов. Он позволяет клиенту работать с семействами продуктов, не зная их конкретных классов, что способствует гибкости и расширяемости кода.
2️⃣ Подробное объяснение темы
Абстрактная фабрика — это один из порождающих паттернов проектирования, который помогает создавать объекты. Он особенно полезен, когда система должна быть независимой от способа создания, композиции и представления объектов, и когда система должна быть сконфигурирована с одним из нескольких семейств продуктов.
Зачем это нужно?
Представьте, что вы разрабатываете приложение, которое должно работать с разными типами пользовательских интерфейсов (например, Windows и macOS). Каждый интерфейс имеет свои собственные элементы, такие как кнопки и окна. Абстрактная фабрика позволяет вам создавать семейства этих элементов, не привязываясь к конкретным реализациям. Это делает ваш код более гибким и легким для расширения.
Где применяется?
Абстрактная фабрика применяется в ситуациях, когда:
- Система должна быть независимой от способа создания и представления продуктов.
- Система должна быть сконфигурирована с одним из нескольких семейств продуктов.
- Необходимо обеспечить совместную работу взаимосвязанных объектов.
- Необходимо предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализации.
Как работает?
Абстрактная фабрика определяет интерфейс для создания каждого из объектов в семействе продуктов. Конкретные фабрики реализуют этот интерфейс, создавая конкретные продукты. Клиент использует интерфейс фабрики для создания объектов, не зная их конкретных классов.
Пример
Рассмотрим пример с созданием элементов пользовательского интерфейса для разных операционных систем.
from abc import ABC, abstractmethod
# Абстрактные продукты
class Button(ABC):
@abstractmethod
def paint(self):
pass
class Checkbox(ABC):
@abstractmethod
def paint(self):
pass
# Конкретные продукты для Windows
class WindowsButton(Button):
def paint(self):
print("Render a button in a Windows style")
class WindowsCheckbox(Checkbox):
def paint(self):
print("Render a checkbox in a Windows style")
# Конкретные продукты для macOS
class MacOSButton(Button):
def paint(self):
print("Render a button in a macOS style")
class MacOSCheckbox(Checkbox):
def paint(self):
print("Render a checkbox in a macOS style")
# Абстрактная фабрика
class GUIFactory(ABC):
@abstractmethod
def create_button(self) -> Button:
pass
@abstractmethod
def create_checkbox(self) -> Checkbox:
pass
# Конкретные фабрики
class WindowsFactory(GUIFactory):
def create_button(self) -> Button:
return WindowsButton()
def create_checkbox(self) -> Checkbox:
return WindowsCheckbox()
class MacOSFactory(GUIFactory):
def create_button(self) -> Button:
return MacOSButton()
def create_checkbox(self) -> Checkbox:
return MacOSCheckbox()
# Клиентский код
def client_code(factory: GUIFactory):
button = factory.create_button()
checkbox = factory.create_checkbox()
button.paint()
checkbox.paint()
# Пример использования
print("Client: Testing client code with the Windows factory:")
client_code(WindowsFactory())
print("\nClient: Testing the same client code with the macOS factory:")
client_code(MacOSFactory())
Как это работает?
- Абстрактные продукты: Определяют интерфейсы для различных типов продуктов (например,
Button,Checkbox). - Конкретные продукты: Реализуют интерфейсы абстрактных продуктов для каждой конкретной платформы (например,
WindowsButton,MacOSButton). - Абстрактная фабрика: Определяет интерфейсы для создания каждого из продуктов (например,
GUIFactory). - Конкретные фабрики: Реализуют интерфейсы абстрактной фабрики для создания конкретных продуктов (например,
WindowsFactory,MacOSFactory). - Клиентский код: Работает с фабриками и продуктами через их интерфейсы, не зная конкретных классов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться