Где используется паттерн фабрика?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерн Фабрика: Области применения
Паттерн Фабрика (Factory Pattern) — это порождающий паттерн проектирования, который инкапсулирует создание объектов, скрывая сложность логики инстанцирования от клиента. Рассмотрю основные области его применения.
1. Создание объектов сложных иерархий
Когда у вас есть базовый класс и множество подклассов, фабрика управляет их созданием:
from abc import ABC, abstractmethod
class DatabaseConnection(ABC):
@abstractmethod
def connect(self):
pass
class PostgresConnection(DatabaseConnection):
def connect(self):
return "Connected to PostgreSQL"
class MongoDBConnection(DatabaseConnection):
def connect(self):
return "Connected to MongoDB"
class DatabaseFactory:
@staticmethod
def create_connection(db_type: str) -> DatabaseConnection:
if db_type == "postgres":
return PostgresConnection()
elif db_type == "mongodb":
return MongoDBConnection()
raise ValueError(f"Unknown database type: {db_type}")
2. Инверсия управления и слабая связанность
Фабрика позволяет клиентскому коду не знать о конкретных реализациях:
db = DatabaseFactory.create_connection("postgres")
result = db.connect()
db = DatabaseFactory.create_connection("mongodb")
3. Логирование и отладка
Фабрика может добавлять кроссконцерны без изменения клиентского кода:
class DatabaseFactory:
@staticmethod
def create_connection(db_type: str):
print(f"Creating connection to {db_type}")
if db_type == "postgres":
return PostgresConnection()
elif db_type == "mongodb":
return MongoDBConnection()
4. Конфигурирование приложения
Фабрика использует конфигурацию для выбора реализации:
import os
class DatabaseFactory:
@staticmethod
def create_connection():
db_type = os.getenv("DATABASE_TYPE", "postgres")
if db_type == "postgres":
return PostgresConnection()
elif db_type == "mongodb":
return MongoDBConnection()
5. Работа с внешними библиотеками
Фабрика скрывает детали инициализации сторонних компонентов:
class LoggerFactory:
@staticmethod
def create_logger(name: str):
import logging
logger = logging.getLogger(name)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
6. Кэширование объектов
Фабрика может кэшировать дорогие объекты:
class ConnectionPool:
_pool = {}
@staticmethod
def get_connection(db_type: str):
if db_type not in ConnectionPool._pool:
ConnectionPool._pool[db_type] = DatabaseFactory.create_connection(db_type)
return ConnectionPool._pool[db_type]
7. Реальные примеры в Python
Джанго использует фабрику для создания моделей, requests.Session() создаёт адаптеры на основе схемы URL, SQLAlchemy create_engine() — фабрика для создания подключений.
8. Тестирование
Фабрика облегчает подмену реальных объектов на моки:
class MockDatabaseConnection(DatabaseConnection):
def connect(self):
return "Mock connection"
Заключение
Паттерн Фабрика применяется когда: множество подклассов одного интерфейса, логика создания объектов сложная, нужна слабая связанность между компонентами, требуется конфигурируемость, необходимо кэширование или логирование при создании.