Para aprender mais sobre os padrões de projeto, segui como guia de estudos o site Refactoring.Guru. Portanto, não tenho intenção de dizer que "fiz todos os códigos", mas sim implementei na linguagem que não existe no site e estou mais habituado.
Design Patterns (comumente relacionados na literatura de TI como “Padrões de Projeto”) são soluções para problemas comuns que encontramos no desenvolvimento ou manutenção de um software orientado a objetos (não são tão bem aplicáveis em outros paradigmas).
...
Os padrões criacionais fornecem vários mecanismos de criação de objetos, que aumentam a flexibilidade e reutilização de código já existente.
Fornece uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos que serão criados.
Permite que você produza famílias de objetos relacionados sem ter que especificar suas classes concretas.
Permite a você construir objetos complexos passo a passo. O padrão permite que você produza diferentes tipos e representações de um objeto usando o mesmo código de construção.
Permite copiar objetos existentes sem fazer seu código ficar dependente de suas classes.
Permite a você garantir que uma classe tenha apenas uma instância, enquanto provê um ponto de acesso global para essa instância.
...
Os padrões comportamentais cuidam da comunicação eficiente e da assinalação de responsabilidades entre objetos.
Permite que você reduza as dependências caóticas entre objetos. O padrão restringe comunicações diretas entre objetos e os força a colaborar apenas através do objeto mediador.
Permite que você defina um mecanismo de assinatura para notificar múltiplos objetos sobre quaisquer eventos que aconteçam com o objeto que eles estão observando.
Permite que você defina uma família de algoritmos, coloque-os em classes separadas, e faça os objetos deles intercambiáveis.
Define o esqueleto de um algoritmo na superclasse mas deixa as subclasses sobrescreverem etapas específicas do algoritmo sem modificar sua estrutura.
...
Os padrões comportamentais cuidam da comunicação eficiente e da assinalação de responsabilidades entre objetos.
Permite que você acople novos comportamentos para objetos ao colocá-los dentro de invólucros de objetos que contém os comportamentos.
Fornece uma interface simplificada para uma biblioteca, um framework, ou qualquer conjunto complexo de classes.
Permite objetos com interfaces incompatíveis colaborarem entre si.