Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Виды паттернов проектирования
Паттерны проектирования — это проверенные решения для типичных проблем. Рассмотрю три главные категории.
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: паттерны помогают избежать повторения кода