Skip to content

📘 Паттерны проектирования (Design Patterns)

Паттерны проектирования — это типовые решения часто встречающихся проблем в разработке программного обеспечения. Они не являются готовыми к использованию классами или библиотеками, а скорее шаблонами мышления и организации кода.

🧩 Типы паттернов

Все паттерны можно разделить на три основные категории:

  1. Порождающие (Creational)
  2. Структурные (Structural)
  3. Поведенческие (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)

Добавляет операции над объектами, не изменяя их классы.


📚 Полезные ресурсы