Sobes.tech
Back to questions
Junior — Middle
71

Объясните различия между паттернами 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