На какие три основные группы делятся классические паттерны проектирования (GoF)?

«На какие три основные группы делятся классические паттерны проектирования (GoF)?» — вопрос из категории Паттерны, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классические паттерны проектирования, описанные в книге "банды четырех" (GoF), делятся на три основные категории в зависимости от их назначения:

  1. Порождающие (Creational) Отвечают за процессы создания объектов, позволяя сделать систему независимой от способа их создания и представления. Они помогают создавать объекты гибко и в контролируемых условиях.

    • Примеры: Singleton (Одиночка), Factory Method (Фабричный метод), Abstract Factory (Абстрактная фабрика), Builder (Строитель), Prototype (Прототип).
  2. Структурные (Structural) Определяют, как из классов и объектов формировать более крупные и сложные структуры, сохраняя их гибкость и эффективность. Они упрощают структуру, идентифицируя отношения между сущностями.

    • Примеры: Adapter (Адаптер), Decorator (Декоратор), Facade (Фасад), Proxy (Заместитель), Composite (Компоновщик), Bridge (Мост).
  3. Поведенческие (Behavioral) Отвечают за эффективное взаимодействие и распределение обязанностей между объектами. Они определяют шаблоны коммуникации между объектами.

    • Примеры: Observer (Наблюдатель), Strategy (Стратегия), Command (Команда), Iterator (Итератор), State (Состояние), Chain of Responsibility (Цепочка обязанностей).

Пример порождающего паттерна (Singleton):

Этот паттерн гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.

class DatabaseConnection:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            print("Создание нового подключения к БД...")
            cls._instance = super().__new__(cls)
        return cls._instance

    def connect(self):
        print("Подключение установлено.")

# Использование
db1 = DatabaseConnection()
db2 = DatabaseConnection()

print(db1 is db2)  # Выведет: True, т.к. это один и тот же объект
db1.connect()