Встречается на 46% собеседований по PHP

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

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

Порождающие паттерны

Порождающие паттерны связаны с процессом создания объектов, делая систему более независимой от способа создания, композиции и представления объектов.

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

Структурные паттерны

Структурные паттерны описывают, как объединить объекты и классы в более крупные структуры, сохраняя при этом гибкость и эффективность структур.

  • Адаптер (Adapter) — позволяет объектам с несовместимыми интерфейсами работать вместе.
  • Мост (Bridge) — разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо.
  • Компоновщик (Composite) — позволяет группировать объекты в древовидные структуры для представления иерархий часть-целое.
  • Декоратор (Decorator) — динамически добавляет объектам новые обязанности без изменения их интерфейса.
  • Фасад (Facade) — предоставляет упрощённый интерфейс к сложной системе классов, библиотеке или фреймворку.
  • Легковес (Flyweight) — используется для уменьшения затрат на создание большого количества мелких похожих объектов.
  • Заместитель (Proxy) — предоставляет заменитель или местозаполнитель для другого объекта для контроля доступа к нему.

Поведенческие паттерны

Поведенческие паттерны описывают не столько шаблоны объектов или классов, сколько шаблоны взаимодействия между ними.

  • Цепочка обязанностей (Chain of Responsibility) — передаёт запросы последовательно по цепочке обработчиков, пока один из них не обработает запрос.
  • Команда (Command) — превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
  • Интерпретатор (Interpreter) — задаёт грамматику для языка и интерпретатор для его грамматики.
  • Итератор (Iterator) — предоставляет способ последовательного доступа ко всем элементам агрегата без раскрытия его внутреннего представления.
  • Посредник (Mediator) — уменьшает сложность взаимодействия между объектами, введя между ними посредника.
  • Хранитель (Memento) — позволяет сохранять и восстанавливать предыдущее состояние объекта без раскрытия деталей его реализации.
  • Наблюдатель (Observer) — создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
  • Состояние (State) — позволяет объекту изменять своё поведение в зависимости от своего состояния.
  • Стратегия (Strategy) — определяет семейство алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость.
  • Шаблонный метод (Template Method) — определяет скелет алгоритма в методе, перекладывая ответственность за некоторые его шаги на подклассы.
  • Посетитель (Visitor) — позволяет добавлять в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.

Коротко

  • Паттерны делятся на порождающие, структурные и поведенческие.
  • Порождающие управляют созданием объектов, структурные — композицией классов, поведенческие — взаимодействием.
  • Знание паттернов помогает проектировать гибкие и поддерживаемые системы, но важно применять их уместно, не усложняя код без необходимости.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы