Обзор шаблонов проектирования с 4 примерами вопросов для интервью, которые помогут вам пройти следующее собеседование.

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

Шаблоны проектирования также часто упоминаются в интервью! Интервьюеры хотят видеть, что вы знаете, для чего используются шаблоны проектирования и почему они важны. Они также хотят знать, какие шаблоны проектирования вы лично имеете опыт использования.

В этой статье я хочу обрисовать в общих чертах, что представляют собой эти шаблоны проектирования, и привести пример их использования в реальном сценарии. В конце я также приведу четыре примера вопросов для собеседования, с которыми я лично сталкивался во время моих прошлых поисков работы.

Обзор шаблонов проектирования

Во-первых, я хочу описать, как разбиваются шаблоны проектирования, и дать краткое описание каждого из них.

Согласно известной книге Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения, существует 23 шаблона проектирования, которые можно разделить на три категории в зависимости от их назначения:

Creational: шаблоны, которые абстрагируют процесс создания экземпляров, чтобы сделать систему независимой от того, как создаются ее объекты.

  1. Абстрактная фабрика. Предоставляет интерфейс для создания семейств связанных объектов без указания их фактических классов.
  2. Конструктор – отделяет построение объекта от его представления, чтобы процесс построения можно было использовать для создания различных представлений.
  3. Фабричный метод — определяет интерфейс для создания объекта, позволяя подклассам решать, экземпляр какого класса создавать.
  4. Прототип —позволяет создавать объекты путем клонирования прототипа.
  5. Singleton —гарантирует, что класс имеет только один экземпляр и глобальную точку доступа для всех тех, кому необходим доступ к нему.

Структурный. Шаблоны, которые упрощают проектирование структур больших объектов, определяя способ определения отношений между объектами.

  1. Адаптер. Позволяет двум несвязанным интерфейсам работать вместе с помощью класса адаптера. Класс адаптера является связующим звеном между двумя иначе несовместимыми классами.
  2. Мост —отделяеткласс абстракции от его реализации, предоставляя класс-мост между ними, чтобы они могли меняться независимо друг от друга.
  3. Композитный.Используется для обработки группы объектов аналогично одному объекту путем компоновки этих объектов в терминах древовидной структуры для представления иерархий часть-целое. (Иерархия часть-целое — это система, состоящая из подсистем или компонентов, которые можно разделить на более мелкие компоненты).
  4. Декоратор –динамически прикрепляет дополнительные обязанности к объекту, предоставляя гибкую альтернативу созданию подклассов для расширения функциональности.
  5. Фасад —определяет упрощенный интерфейс для набора интерфейсов в подсистеме. Он используется как высокоуровневый интерфейс, который упрощает использование всего остального.
  6. Легкий вес —определяет общий объект, который можно использовать в нескольких контекстах одновременно, помогая сократить использование памяти в системе.
  7. Прокси –предоставляет заполнитель для другого объекта, чтобы управлять доступом к нему. По сути, это класс, функционирующий как интерфейс к другому объекту в системе.

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

  1. Цепочка ответственности.Избегает привязки отправки запроса к его получателю, предоставляя более чем одному объекту возможность обработать запрос. Этот шаблон передает запросы по цепочке, пока объект не обработает их.
  2. Команда –инкапсулирует запрос в автономный объект, содержащий всю информацию о выполнении запроса. Это позволяет нам параметризовать клиентов с различными запросами, регистрировать запросы и поддерживать обычно невыполнимые операции.
  3. Интерпретатор –определяет представление грамматики на языке вместе с интерпретатором, который использует это представление для интерпретации предложений на языке. Этот шаблон широко используется в компиляторах для объектно-ориентированных языков.
  4. Итератор. Предоставляет способ последовательного доступа к элементам в агрегатном объекте без раскрытия базового представления этих объектов.
  5. Посредник —определяет объект, который инкапсулирует способ взаимодействия набора объектов друг с другом. Этот шаблон не позволяет объектам явно ссылаться друг на друга и позволяет изменять их взаимодействие независимо друг от друга.
  6. Memento —захватывает и передает внутреннее состояние объекта, не нарушая инкапсуляцию, что позволяет позже восстановить объект в этом состоянии.
  7. Наблюдатель — позволяет объекту публиковать изменения своего состояния, в то время как другие объекты подписываются на немедленное уведомление об этих изменениях.
  8. Состояние — позволяет объекту изменять свое поведение при изменении его внутреннего состояния.
  9. Стратегия.Также известный как политика, этот шаблон определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Это позволяет алгоритму изменяться независимо от клиентов, которые его используют.
  10. Шаблонный метод. Позволяет подклассам переопределять шаги алгоритма без изменения структуры алгоритма. Алгоритм представляет собой скелет, который откладывает некоторые шаги для этих подклассов.
  11. Посетитель –представляет операцию, которая должна выполняться над элементами структуры объектов. Позволяет определить новую операцию без изменения классов элементов, с которыми она работает.

Хорошо, это много шаблонов дизайна. Давайте углубимся в один из них и рассмотрим пример его использования.

Фабричный метод (творческий шаблон)

Шаблон проектирования Factory Method предлагает решение проблем, например, когда у вас есть

  • класс, который не может предвидеть класс объектов, которые он должен создать
  • класс, который хочет, чтобы его подклассы определяли объект, который он создает
  • классы, которые могут делегировать ответственность нескольким различным вспомогательным подклассам, и вы хотите локализовать знания о том, какой подкласс делегировать

Давайте рассмотрим пример использования фабричного метода. Допустим, мы создаем систему управления сотрудниками для компании, и у нас есть интерфейс Employee, который будет реализован всеми различными ролями, которые у нас есть.

Давайте начнем с создания нашего интерфейса Employee и реализации подклассов. Для простоты этого примера наш интерфейс Employee будет определять только один метод для введения. Подклассы будут включать разработчика, тестировщика и менеджера программы.

Хорошо, у нас есть наш интерфейс и наши реализующие классы. Давайте также включим класс Enum, чтобы определить допустимые типы сотрудников.

Теперь вместо того, чтобы класс использовал все эти разные конструкторы для каждого типа сотрудников, которых он хочет создать, давайте реализуем единую точку управления для создания новых сотрудников, которая будет нашим фабричным классом.

Теперь у нас есть единый метод, который можно использовать для создания всех наших различных типов сотрудников! Вот пример его использования:

4 вопроса для интервью с примерами ответов

1) Какие шаблоны проектирования вы использовали?

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

Ответ: «В моем текущем проекте я использую шаблон Observer во многих сценариях. Например, у нас есть подсистема мониторинга, которая изменяет состояние различных контролируемых компонентов в нашей базе данных по мере поступления событий. Когда эти состояния изменяются, у нас есть несколько подписчиков, которых необходимо уведомить об этом изменении состояния. Шаблон наблюдателя помогает удалить избыточный код, создав единый класс для отслеживания состояния этих компонентов и уведомления подписчиков по мере необходимости».

2) Что такое шаблоны проектирования?

Это более характерно для новых выпускников, так как интервьюер просто хочет увидеть, что у вас есть базовые знания о шаблонах проектирования.

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

3) Почему важны шаблоны проектирования?

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

Ответ: «Шаблоны проектирования важны, потому что они помогают разработчикам писать чистый, удобочитаемый и удобный для сопровождения код. Это облегчает жизнь разработчикам, поскольку им не нужно изобретать велосипед для решения проблемы. Вместо этого они могут использовать эти хорошо известные шаблоны проектирования, которые уже доказали свою эффективность. По моему опыту, еще одним огромным преимуществом является то, что шаблоны проектирования помогают в общении между инженерами. Когда вы объясняете дизайн системы, используя общие шаблоны проектирования, другим инженерам гораздо легче представить дизайн в своей голове».

4) Можете ли вы сказать мне, что такое класс Singleton и когда он может быть полезен?

Я столкнулся с этим вопросом в двух разных интервью для ролей на основе Java.

Шаблон Singleton, вероятно, является наиболее известным и простым в реализации шаблоном проектирования в программной инженерии, поэтому, похоже, это ключевой момент, который вам нужно знать, собираясь на собеседование.

Я упомяну, что шаблон синглтона в наши дни немного не одобряется. Это может привести к жесткой связи и усложнить тестирование, поскольку вы не можете смоделировать компонент, как обычно. Но, по моему опыту, это все еще часто всплывает в интервью.

Ответ: «Отдельный класс — это класс, в котором в приложении может существовать только один экземпляр этого класса. В Java это может быть реализовано путем создания закрытого конструктора с полем для хранения результата и статического метода доступа, такого как getInstance(). Этот тип класса полезен, когда вам нужен ровно один объект для координации действий в вашей системе».

Заключение

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

Если у вас в основном есть опыт поддержки или добавления в проект, который уже существует какое-то время, то вы можете даже не осознавать некоторые шаблоны проектирования, которые используете. В этом случае внимательно изучите свою кодовую базу, и я уверен, что вы сможете обнаружить некоторые из этих шаблонов проектирования, которые используются.

Спасибо за прочтение!

Want to Connect?
You can reach me through my personal website where I have links to my other socials and a contact form - I am always happy to connect with new people!