Изучение шаблона «Фабрика»: руководство по методам реализации

Шаблон «Фабрика» — это шаблон творческого проектирования, который предоставляет интерфейс для создания объектов без указания их конкретных классов. Он способствует слабой связи, инкапсуляции и гибкости при создании объектов. В этой статье мы рассмотрим различные методы реализации шаблона фабрики, сопровождаемые примерами кода.

Метод 1: простой фабричный метод

class Product:
    def __init__(self, name):
        self.name = name

    def operation(self):
        pass
class ProductFactory:
    def create_product(self, product_type):
        if product_type == "A":
            return ProductA()
        elif product_type == "B":
            return ProductB()
        else:
            raise ValueError("Invalid product type.")
class ProductA(Product):
    def operation(self):
        print("Product A operation.")
class ProductB(Product):
    def operation(self):
        print("Product B operation.")
# Usage
factory = ProductFactory()
product_a = factory.create_product("A")
product_a.operation()  # Output: "Product A operation."

Метод 2: Фабричный метод

from abc import ABC, abstractmethod
class Product(ABC):
    def operation(self):
        pass
class ProductFactory(ABC):
    @abstractmethod
    def create_product(self):
        pass
class ProductA(Product):
    def operation(self):
        print("Product A operation.")
class ProductB(Product):
    def operation(self):
        print("Product B operation.")
class ConcreteProductFactoryA(ProductFactory):
    def create_product(self):
        return ProductA()
class ConcreteProductFactoryB(ProductFactory):
    def create_product(self):
        return ProductB()
# Usage
factory_a = ConcreteProductFactoryA()
product_a = factory_a.create_product()
product_a.operation()  # Output: "Product A operation."

Метод 3: метод абстрактной фабрики

from abc import ABC, abstractmethod
class AbstractProductA(ABC):
    @abstractmethod
    def operation(self):
        pass
class AbstractProductB(ABC):
    @abstractmethod
    def operation(self):
        pass
class AbstractFactory(ABC):
    @abstractmethod
    def create_product_a(self) -> AbstractProductA:
        pass

    @abstractmethod
    def create_product_b(self) -> AbstractProductB:
        pass
class ConcreteProductA1(AbstractProductA):
    def operation(self):
        print("Concrete Product A1 operation.")
class ConcreteProductA2(AbstractProductA):
    def operation(self):
        print("Concrete Product A2 operation.")
class ConcreteProductB1(AbstractProductB):
    def operation(self):
        print("Concrete Product B1 operation.")
class ConcreteProductB2(AbstractProductB):
    def operation(self):
        print("Concrete Product B2 operation.")
class ConcreteFactory1(AbstractFactory):
    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA1()
    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA2()
    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB2()
# Usage
factory1 = ConcreteFactory1()
product_a1 = factory1.create_product_a()
product_b1 = factory1.create_product_b()
product_a1.operation()  # Output: "Concrete Product A1 operation."
product_b1.operation()  # Output: "Concrete Product B1 operation."

Шаблон фабрики обеспечивает гибкое создание объектов без явного указания конкретных классов. В этой статье мы рассмотрели три распространенных метода реализации: простой фабричный метод, фабричный метод и абстрактный фабричный метод. Каждый метод служит разным целям и может быть выбран в зависимости от сложности и требований проекта.