Назад к вопросам
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())