Какие знаешь паттерны проектирования
Python
Middle
Без компании
Какие знаешь паттерны проектирования
Ответы
**Паттерны проектирования** — это типовые решения частых проблем в объектно-ориентированном проектировании.
**Они делятся на три основные группы:**
**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)**
**Задача:** Позволить объекту изменять свое поведение при изменении его внутреннего состояния.