Абстрактная фабрика (Abstract Factory) – это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, без указания их конкретных классов. Паттерн “Абстрактная фабрика” позволяет создавать объекты согласованными по интерфейсу, что делает его особенно полезным в ситуациях, когда нужно обеспечить совместимость между разными семействами объектов.
Основные участники паттерна “Абстрактная фабрика”:
- Абстрактная фабрика (Abstract Factory): Это интерфейс или абстрактный класс, который определяет методы для создания семейства взаимосвязанных объектов. Каждый метод абстрактной фабрики соответствует одному из объектов, которые она должна создавать.
- Конкретная фабрика (Concrete Factory): Это класс, который реализует интерфейс абстрактной фабрики. Конкретная фабрика создает объекты, принадлежащие к семейству, и обеспечивает их согласованность.
- Продукт (Product): Это абстрактный класс или интерфейс, который определяет общий интерфейс для объектов, создаваемых абстрактной фабрикой.
- Конкретный продукт (Concrete Product): Это классы, которые реализуют интерфейс продукта. Конкретные продукты создаются конкретной фабрикой и предоставляют конкретные реализации объектов.
Пример использования паттерна “Абстрактная фабрика” на Python:
python
from abc import ABC, abstractmethod # Абстрактные классы продуктов class Chair(ABC): @abstractmethod def sit_on(self): pass class Sofa(ABC): @abstractmethod def relax_on(self): pass # Конкретные продукты class VictorianChair(Chair): def sit_on(self): print("Сидите на викторианском стуле") class ModernChair(Chair): def sit_on(self): print("Сидите на современном стуле") class VictorianSofa(Sofa): def relax_on(self): print("Отдыхайте на викторианском диване") class ModernSofa(Sofa): def relax_on(self): print("Отдыхайте на современном диване") # Абстрактная фабрика class FurnitureFactory(ABC): @abstractmethod def create_chair(self): pass @abstractmethod def create_sofa(self): pass # Конкретные фабрики class VictorianFurnitureFactory(FurnitureFactory): def create_chair(self): return VictorianChair() def create_sofa(self): return VictorianSofa() class ModernFurnitureFactory(FurnitureFactory): def create_chair(self): return ModernChair() def create_sofa(self): return ModernSofa() # Создание мебели victorian_factory = VictorianFurnitureFactory() modern_factory = ModernFurnitureFactory() chair1 = victorian_factory.create_chair() sofa1 = victorian_factory.create_sofa() chair2 = modern_factory.create_chair() sofa2 = modern_factory.create_sofa() chair1.sit_on() # Вывод: Сидите на викторианском стуле sofa1.relax_on() # Вывод: Отдыхайте на викторианском диване chair2.sit_on() # Вывод: Сидите на современном стуле sofa2.relax_on() # Вывод: Отдыхайте на современном диване
В этом примере есть две конкретные фабрики, каждая из которых создает свои собственные продукты (стулья и диваны) в соответствии с выбранным стилем (викторианский или современный). Это обеспечивает согласованность между продуктами в рамках каждой фабрики.