Шаблон «Фабрика» — это шаблон творческого проектирования, который предоставляет интерфейс для создания объектов без указания их конкретных классов. Он способствует слабой связи, инкапсуляции и гибкости при создании объектов. В этой статье мы рассмотрим различные методы реализации шаблона фабрики, сопровождаемые примерами кода.
Метод 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."
Шаблон фабрики обеспечивает гибкое создание объектов без явного указания конкретных классов. В этой статье мы рассмотрели три распространенных метода реализации: простой фабричный метод, фабричный метод и абстрактный фабричный метод. Каждый метод служит разным целям и может быть выбран в зависимости от сложности и требований проекта.