Назад к вопросам
Middle+
94
questionbank

Что такое абстрактная фабрика?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные компоненты:

  • Абстрактная фабрика (Abstract Factory): Интерфейс, объявляющий набор методов для создания абстрактных продуктов.
  • Конкретная фабрика (Concrete Factory): Реализация абстрактной фабрики, которая создает конкретные объекты семейства.
  • Абстрактный продукт (Abstract Product): Интерфейс для типа объекта, создаваемого соответствующим методом абстрактной фабрики.
  • Конкретный продукт (Concrete Product): Реализация абстрактного продукта, созданная определенной конкретной фабрикой.
  • Клиент (Client): Код, использующий интерфейсы абстрактной фабрики и продуктов. Клиент не зависит от конкретных классов фабрики или продуктов.

Преимущества:

  • Изоляция клиента от конкретных классов продуктов.
  • Обеспечение согласованности между продуктами одного семейства.
  • Упрощение замены семейств продуктов.

Недостатки:

  • Добавление нового типа продукта во все фабрики может потребовать изменения.

Пример структуры:

// Абстрактная фабрика
class AbstractFactory:
    def create_product_a(self):
        pass

    def create_product_b(self):
        pass

// Конкретная фабрика 1
class ConcreteFactory1(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA1()

    def create_product_b(self):
        return ConcreteProductB1()

// Конкретная фабрика 2
class ConcreteFactory2(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA2()

    def create_product_b(self):
        return ConcreteProductB2()

// Абстрактный продукт A
class AbstractProductA:
    def useful_function_a(self):
        pass

// Конкретный продукт A1
class ConcreteProductA1(AbstractProductA):
    def useful_function_a(self):
        return "The result of the product A1."

// Конкретный продукт A2
class ConcreteProductA2(AbstractProductA):
    def useful_function_a(self):
        return "The result of the product A2."

// Абстрактный продукт B
class AbstractProductB:
    def useful_function_b(self):
        pass

    def another_useful_function_b(self, collaborator):
        pass

// Конкретный продукт B1
class ConcreteProductB1(AbstractProductB):
    def useful_function_b(self):
        return "The result of the product B1."

    def another_useful_function_b(self, collaborator):
        # B1 works with A1
        result = collaborator.useful_function_a()
        return f"The result of the B1 collaborating with the ({result})"

// Конкретный продукт B2
class ConcreteProductB2(AbstractProductB):
    def useful_function_b(self):
        return "The result of the product B2."

    def another_useful_function_b(self, collaborator):
        # B2 works with A2
        result = collaborator.useful_function_a()
        return f"The result of the B2 collaborating with the ({result})"

// Клиентский код
def client_code(factory: AbstractFactory):
    product_a = factory.create_product_a()
    product_b = factory.create_product_b()

    print(f"{product_b.useful_function_b()}")
    print(f"{product_b.another_useful_function_b(product_a)}")

# Пример использования
if __name__ == "__main__":
    print("Client: Testing client code with the first factory type:")
    client_code(ConcreteFactory1())

    print("\nClient: Testing the same client code with the second factory type:")
    client_code(ConcreteFactory2())