← Назад к вопросам

Где используется паттерн фабрика?

2.3 Middle🔥 141 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Фабрика: Области применения

Паттерн Фабрика (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"

Заключение

Паттерн Фабрика применяется когда: множество подклассов одного интерфейса, логика создания объектов сложная, нужна слабая связанность между компонентами, требуется конфигурируемость, необходимо кэширование или логирование при создании.