Паттерны GoF: инструкция по изучению



В 1994 вышла книжка Design Patterns: Elements of Reusable Object-Oriented Software. Авторов часто называют Gang of Four — Банда четырёх, а описанные в книге приёмы - паттернами GoF.



Зачем?

Паттерны активно используются на практике, а ещё помогут:

🔸Общаться с коллегами на одном языке и быстро обсуждать идеи.

🔸Проходить собеседования на джуниор и мидл позиции.



Что читать?



Книга "Design Patterns: Elements of Reusable Object-Oriented Software"

Та самая книга. 1994 год, 440 страниц, примеры на С++. В 2020 году вышло обновлённое издание, но стиль изложения не изменился, читать тяжело.



Википедия

Текст и диаграммы скопированы из книги Design patterns.



😐 Книга "Head First: Паттерны проектирования"

Простые описания, много картинок и примеров, но очень растянуто — 650 страниц.



Каталог паттернов

Читать приятно, много схем и картинок. Всё по полочкам: какая проблема решается, преимущества и недостатки паттерна, сравнение паттернов между собой. Есть примеры на java.

Ресурс не идеален, но это лучшее по теме паттернов в интернете.



Какие сложности могут быть?



1️⃣ Формализм

Паттерны сами по себе простые. Некоторые из них вы использовали, не осознавая этого. Но определения паттернов максимально формальные. Все ресурсы описывают цель паттерна Мост так:



«Отделить абстракцию от реализации так, чтобы то и другое можно было изменять независимо»



Поэтому ориентируйтесь на примеры и картинки.



2️⃣ Непонятна разница между паттернами

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



3️⃣ Мало реальных примеров

Для объяснения часто берут вымышленные примеры, хотя к каждому паттерну можно подобрать пример из JDK или Spring.



4️⃣ Не все одинаково полезны

Одни используются чаще, чем другие. Некоторые паттерны никогда не придётся писать самостоятельно:

▪️Итератор есть в каждой коллекции.

▪️Команда передаётся в лямбда выражениях.

▪️Синглтон легко создать через аннотацию Component в Spring.



Каждый паттерн - готовое решение конкретной проблемы. На практике всё может быть интереснее как по задачам, так и по реализации. Например, паттерн Builder может помочь при разработке многопоточных программ, а паттерн Proxy можно реализовать через AOP.