Back to questions
Junior — Middle
70
Объясните различия между паттернами Factory Method и Abstract Factory, их основные отличия и случаи применения.
Answer from AI
sobes.tech AI
Factory Method — это паттерн, который определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. Он используется, когда нужно делегировать создание объектов подклассам, чтобы повысить гибкость и расширяемость.
Abstract Factory — это паттерн, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов. Он полезен, когда нужно создавать набор связанных объектов, которые должны работать вместе.
Основные отличия:
- Factory Method создает один продукт, Abstract Factory — семейство продуктов.
- Factory Method обычно реализуется через наследование, Abstract Factory — через композицию.
Случаи применения:
- Factory Method: когда есть иерархия продуктов и нужно делегировать создание конкретного продукта подклассам.
- Abstract Factory: когда нужно создавать семейства связанных объектов, обеспечивая их совместимость.
Пример Factory Method на Python:
from abc import ABC, abstractmethod
class Product(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteProductA(Product):
def operation(self):
return "Result of ConcreteProductA"
class Creator(ABC):
@abstractmethod
def factory_method(self):
pass
def some_operation(self):
product = self.factory_method()
return product.operation()
class ConcreteCreatorA(Creator):
def factory_method(self):
return ConcreteProductA()
creator = ConcreteCreatorA()
print(creator.some_operation()) # Output: Result of ConcreteProductA
Пример Abstract Factory на Python:
from abc import ABC, abstractmethod
class AbstractProductA(ABC):
@abstractmethod
def useful_function_a(self):
pass
class AbstractProductB(ABC):
@abstractmethod
def useful_function_b(self):
pass
class ConcreteProductA1(AbstractProductA):
def useful_function_a(self):
return "A1"
class ConcreteProductB1(AbstractProductB):
def useful_function_b(self):
return "B1"
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
pass
@abstractmethod
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
factory = ConcreteFactory1()
product_a = factory.create_product_a()
product_b = factory.create_product_b()
print(product_a.useful_function_a()) # Output: A1
print(product_b.useful_function_b()) # Output: B1