Задачник невозможен, потому что…
1. Паттерны проявляют себя в крупных программах. Даже 2000 строк можно написать по наитию.
2. Нет единого ответа. И как вы будете сверяться, верно вы сделали или нет?
3. Сильно зависит от языка: например, идиома pimpl — это чистый Си++.
4. Даже зависит от того, библиотека встроенная или внешняя: внешние библиотеки в низкоуровневый код всегда стараются вносить очень осторожно.
Пример: нам надо включать-выключать лог в консольной программе, простейший вопрос. Варианты…
1. Просто переменная isLoggingOn, которая включает этот самый лог.
2. Одиночка-стратегия-null object.
И тут появляется вопрос: а что делать, если у нас тут ещё и форматирование на манер printf? Где находится утилита форматирования: в «волшебном круге» интерфейса Logger или нет? А если нет — то можно придумать модуль-утилиту за пределами этого «волшебного круга»? А если пишем на Си#, может, этот модуль-утилита — это метод-расширение? А если пишем на Си++, может, вообще можно не заморачиваться из-за того, что связанные с std::format функции шаблонные и если ни одна не расшаблонилась — с нас и взятки гладки?