Встречается на 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
интервью вопросы и ответы
