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

Python Senior Без компании
Какие знаешь паттерны проектирования
Ответы
**Паттерны проектирования** — это типовые решения частых проблем в объектно-ориентированном проектировании. **Они делятся на три основные группы:** **1. Порождающие паттерны (Creational Patterns)** **Решают проблемы создания объектов.** Они абстрагируют процесс инстанцирования, делая систему независимой от способа создания, композиции и представления объектов. #### **a) Одиночка (Singleton)** **Задача:** Гарантировать, что у класса есть только один экземпляр, и предоставить к нему глобальную точку доступа. ``` class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance # Использование obj1 = Singleton() obj2 = Singleton() print(obj1 is obj2) # True - это один и тот же объект ``` #### **b) Фабричный метод (Factory Method)** **Задача:** Определить интерфейс для создания объекта, но позволить подклассам изменять тип создаваемых объектов. #### **c) Строитель (Builder)** **Задача:** Разделить сложный конструктор объекта на отдельные шаги, чтобы один и тот же процесс конструирования мог создавать разные представления. **2. Структурные паттерны (Structural Patterns)** **Решают проблемы композиции объектов.** Они показывают, как из отдельных объектов составлять более крупные структуры. #### **a) Адаптер (Adapter)** **Задача:** Преобразовать интерфейс класса к другому интерфейсу, который ожидают клиенты. ``` class OldSystem: def old_method(self): return "Старая система" class NewSystem: def new_method(self): return "Новая система" class Adapter: def __init__(self, system): self.system = system def old_method(self): return self.system.new_method() # Использование old = OldSystem() new = NewSystem() adapter = Adapter(new) print(adapter.old_method()) # "Новая система" ``` #### **b) Декоратор (Decorator)** **Задача:** Динамически добавлять объекту новую функциональность, оборачивая его в объект-декоратор. #### **c) Фасад (Facade)** **Задача:** Представить простой интерфейс к сложной системе классов. **3. Поведенческие паттерны (Behavioral Patterns)** **Решают проблемы эффективного взаимодействия между объектами.** Они определяют, как объекты общаются и распределяют ответственность. #### **a) Наблюдатель (Observer)** **Задача:** Определить зависимость "один ко многим" между объектами, чтобы при изменении состояния одного объекта все зависящие от него объекты автоматически уведомлялись. ``` class Subject: def __init__(self): self._observers = [] def attach(self, observer): self._observers.append(observer) def notify(self, message): for observer in self._observers: observer.update(message) class Observer: def update(self, message): print(f"Получено сообщение: {message}") # Использование subject = Subject() observer1 = Observer() observer2 = Observer() subject.attach(observer1) subject.attach(observer2) subject.notify("Данные обновлены!") ``` #### **b) Стратегия (Strategy)** **Задача:** Определить семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми. #### **c) Состояние (State)** **Задача:** Позволить объекту изменять свое поведение при изменении его внутреннего состояния.