Как использовать шаблоны проектирования на практике?
зачем они вообще нужны в работе, ведь всё хорошо и без них?
Видите ли, паттерны это не что-то такое, что "применяют намерянно", они просто появляются. Им просто дали названия и все. Это "словарь", что бы быстро сказать другому разработчику мол "мы тут медиатор впихнем, а сверху вот этой фигни фасадом закроем". И всем сразу все понятно.
Словом, если вы разберетесь с принципами SOLID и GRASP, а так же в принципе с ООП (сокрытие состояния, обмен сообщениями между объектами разных типов), то паттерны будут появляться сами по себе.
Еще хорошо себя показывает TDD в вопросах "как узнать как лучше делать". В виде теста описываем что должен делать объект, или как они взаимодействуют, потом делаем. Если неудобно в тестах или они становятся слишком завязаны на реализацию (опять же неудобно поддерживать) - то значит что-то пошло не так и надо рефакторить. А при наличии тестов это делать очень легко и просто.
Почитать хорошо бы вот такое - www.ozon.ru/context/detail/id/33506422
Посмотреть примеры кода - наверное лучше будет на примере популярного фреймворка. 
Понять как он устроен, где какие паттерны применены и какие проблемы они решают.
Я бы советовал Symfony - https://github.com/symfony/symfony