📘 Паттерны проектирования (Design Patterns)
Паттерны проектирования — это типовые решения часто встречающихся проблем в разработке программного обеспечения. Они не являются готовыми к использованию классами или библиотеками, а скорее шаблонами мышления и организации кода.
🧩 Типы паттернов
Все паттерны можно разделить на три основные категории:
- Порождающие (Creational)
- Структурные (Structural)
- Поведенческие (Behavioral)
1. 🚀 Порождающие паттерны
Отвечают за создание объектов, абстрагируя логику их создания.
🔹 Фабричный метод (Factory Method)
Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать.
class CarFactory:
def create_car(self):
pass
class TeslaFactory(CarFactory):
def create_car(self):
return Tesla()
tesla = TeslaFactory().create_car()
🔹 Абстрактная фабрика (Abstract Factory)
Создает семейства связанных или зависимых объектов без указания их конкретных классов.
🔹 Строитель (Builder)
Позволяет пошагово конструировать сложные объекты.
🔹 Прототип (Prototype)
Клонирование объектов вместо создания новых экземпляров через наследование.
🔹 Одиночка (Singleton)
Гарантирует существование только одного экземпляра класса.
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
2. 🧱 Структурные паттерны
Определяют, как объекты и классы объединяются в составные структуры.
🔹 Адаптер (Adapter)
Преобразует интерфейс одного класса в другой, совместимый с клиентом.
🔹 Мост (Bridge)
Разделяет абстракцию и её реализацию так, чтобы их можно было изменять независимо.
🔹 Компоновщик (Composite)
Объединяет объекты в древовидную структуру для представления иерархии части-целое.
🔹 Декоратор (Decorator)
Добавляет поведение к объекту динамически, без изменения его класса.
🔹 Фасад (Facade)
Предоставляет простой интерфейс к сложной системе.
class Computer:
def start(self): ...
class User:
def press_button(self):
comp = Computer()
comp.start()
🔹 Заместитель (Proxy)
Контролирует доступ к другому объекту, добавляя дополнительное поведение.
🔹 Легковес (Flyweight)
Минимизирует использование памяти при помощи разделения общего состояния между многими мелкими объектами.
3. 💬 Поведенческие паттерны
Определяют способы взаимодействия между объектами.
🔹 Цепочка обязанностей (Chain of Responsibility)
Передает запрос по цепочке обработчиков до тех пор, пока один из них не обработает его.
🔹 Команда (Command)
Инкапсулирует запрос как объект, позволяя параметризовать другие объекты различными запросами.
🔹 Интерпретатор (Interpreter)
Определяет представление грамматики языка и интерпретатор предложений этого языка.
🔹 Итератор (Iterator)
Предоставляет способ последовательного доступа ко всем элементам коллекции без раскрытия ее внутренней структуры.
🔹 Посредник (Mediator)
Централизует взаимодействие между компонентами системы.
🔹 Хранитель (Memento)
Фиксирует и восстанавливает состояние объекта, не нарушая инкапсуляции.
🔹 Наблюдатель (Observer)
Один объект оповещает других об изменении своего состояния.
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def notify(self):
for observer in self._observers:
observer.update(self)
🔹 Состояние (State)
Изменяет поведение объекта в зависимости от его внутреннего состояния.
🔹 Стратегия (Strategy)
Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
🔹 Посетитель (Visitor)
Добавляет операции над объектами, не изменяя их классы.
📚 Полезные ресурсы
- Design Patterns: Elements of Reusable Object-Oriented Software — "Банда четырех" (GoF)
- Refactoring.Guru - Design Patterns
- Head First Design Patterns
- Онлайн-курсы: Udemy, Coursera, Stepik (по ООП и паттернам)