Quando eu era um programador iniciante, adorava padrões de design. Eu não usei apenas padrões de design. Eu os infligi. Onde e quando eu pudesse. Eu fui impiedoso. Ah! Padrão de observador! Pegue isso! Use um ouvinte! Proxy! AbstractFactory! Por que usar uma camada de abstração quando cinco o fazem? Falei com muitos programadores experientes e descobri que quase todos que lêem o GoF Book passam por este estágio.
Os programadores iniciantes não usam padrões de design. Eles abusam de padrões de design.
Mais recentemente, acho que manter em mente princípios como o Princípio da Responsabilidade Única, e escrever testes primeiro, ajuda os padrões a emergirem de uma maneira mais pragmática. Quando reconheço os padrões, posso continuar a progredir com mais facilidade. Eu os reconheço, mas não tentei forçá-los no código. Se um padrão de visitante surgir é provavelmente porque eu refatorei a duplicação, não porque eu pensei antes sobre as semelhanças de renderizar uma árvore versus somar seus valores.
Programadores experientes não usam padrões de design. Padrões de design os usam.