← Назад ко всем вопросам

Паттерн: Абстрактная фабрика (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())

Как это работает?

  1. Абстрактные продукты: Определяют интерфейсы для различных типов продуктов (например, Button, Checkbox).
  2. Конкретные продукты: Реализуют интерфейсы абстрактных продуктов для каждой конкретной платформы (например, WindowsButton, MacOSButton).
  3. Абстрактная фабрика: Определяет интерфейсы для создания каждого из продуктов (например, GUIFactory).
  4. Конкретные фабрики: Реализуют интерфейсы абстрактной фабрики для создания конкретных продуктов (например, WindowsFactory, MacOSFactory).
  5. Клиентский код: Работает с фабриками и продуктами через их интерфейсы, не зная конкретных классов.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки