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

Какие знаешь виды паттернов?

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

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

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

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

# Виды паттернов проектирования

Паттерны проектирования — это проверенные решения для типичных проблем. Рассмотрю три главные категории.

1. Порождающие паттерны (Creational)

Singleton

class DatabaseConnection:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

Factory

class DatabaseFactory:
    @staticmethod
    def create_driver(db_type: str):
        if db_type == "postgres":
            return PostgresDriver()
        elif db_type == "mysql":
            return MySQLDriver()

Builder

class QueryBuilder:
    def select(self, *columns):
        self.query += f"SELECT {', '.join(columns)} "
        return self
    
    def from_table(self, table):
        self.query += f"FROM {table} "
        return self

Prototype

import copy

user1 = User("John", "john@example.com")
user2 = copy.deepcopy(user1)

2. Структурные паттерны (Structural)

Adapter

Преобразует интерфейс одного класса в другой. Полезно при интеграции старого и нового кода.

Decorator

Динамически добавляет функциональность к объекту.

class MilkDecorator(CoffeeDecorator):
    def cost(self):
        return self._coffee.cost() + 2

Facade

Предоставляет упрощённый интерфейс к сложной подсистеме.

class OrderFacade:
    def complete_order(self, order_id, amount):
        self.order.process_order(order_id)
        self.payment.charge(amount)
        self.shipping.ship(order_id)

Proxy

Контролирует доступ к другому объекту. Часто используется для кэширования.

3. Поведенческие паттерны (Behavioral)

Strategy

Определяет семейство алгоритмов и делает их взаимозаменяемыми.

class PaymentStrategy:
    def pay(self, amount):
        pass

processor = PaymentProcessor(CreditCardPayment())
processor.strategy = PayPalPayment()  # Меняем стратегию

Observer

Оповещает множество объектов об изменении состояния.

emitter.on("user_registered", callback1)
emitter.on("user_registered", callback2)
emitter.emit("user_registered", user_data)

Command

Инкапсулирует запрос как объект. Позволяет отменять операции (Undo).

class TurnOnCommand:
    def execute(self):
        self.light.turn_on()
    
    def undo(self):
        self.light.turn_off()

State

Позволяет объекту изменять своё поведение в зависимости от состояния.

class Order:
    def __init__(self):
        self.state = PendingState()
    
    def confirm(self):
        self.state = self.state.confirm()

Template Method

Определяет скелет алгоритма, оставляя детали подклассам.

class DataProcessor:
    def process(self):
        self.read_data()
        self.validate_data()
        self.save_data()
    
    def validate_data(self):
        pass  # Переопределяется в подклассах

4. Архитектурные паттерны

MVC (Model-View-Controller)

  • Model: данные и бизнес-логика
  • View: представление
  • Controller: обработка ввода

MVVM (Model-View-ViewModel)

  • ViewModel содержит логику представления
  • Подходит для фронтенда

Event-Driven Architecture

  • Компоненты общаются через события
  • Слабая связанность

Microservices

  • Приложение разделено на маленькие сервисы
  • Каждый сервис независим

Repository Pattern

Абстрагирует доступ к данным.

class UserRepository:
    def get_by_id(self, user_id):
        pass
    
    def save(self, user):
        pass

5. Сравнение паттернов

ПаттернПроблемаРешение
SingletonНесколько экземпляровОдин объект на всё приложение
FactoryСоздание разных типовЕдиная точка создания
DecoratorДобавить функционалОборачиваем объект
StrategyРазные алгоритмыВыбираем алгоритм в runtime
ObserverСвязанностьСобытия вместо прямых вызовов
ProxyКонтроль доступаПосредник между объектами

Выводы

  • Порождающие: как создавать объекты
  • Структурные: как организовывать отношения
  • Поведенческие: как объекты взаимодействуют
  • Архитектурные: структура всего приложения
  • KISS: не переусложняй, используй паттерны когда они нужны
  • DRY: паттерны помогают избежать повторения кода