Nenhum padrão de design é necessário. Em qualquer idioma.
Costumo encontrar muitos códigos escritos por pessoas que leem sobre padrões de design e pensam que devem usá-los em todo o lugar. O resultado é que o código real fica oculto sob toneladas de interfaces, invólucros e camadas e é muito difícil de ler. Essa é uma abordagem errada aos padrões de design.
Os padrões de design existem para que você tenha um repertório de expressões úteis úteis quando se deparar com um problema. Mas você nunca deve aplicar nenhum padrão antes de identificar o problema. Mantenha as coisas simples Estúpido deve sempre ser o princípio superior de governo.
Também ajuda a pensar nos padrões de design como um conceito para pensar no problema, e não no código específico para escrever. E sobre grande parte do boilerplate como solução alternativa para Java sem funções livres e objetos de função padrão que você usa na maioria das outras linguagens que os possuem (como Python, C #, C ++ etc.).
Eu poderia dizer que tenho um padrão de visitante, mas em qualquer idioma com funções de primeira classe, será apenas uma função que assume uma função. Em vez da classe de fábrica, normalmente tenho apenas uma função de fábrica. Posso dizer que tenho uma interface, mas são apenas alguns métodos marcados com comentários, porque não haveria outra implementação (é claro que em python uma interface é sempre apenas comentários, porque é do tipo pato). Eu ainda falo do código como usando o padrão, porque é uma maneira útil de pensar sobre isso, mas não digite todas as coisas até que eu realmente precise.
Portanto, aprenda todos os padrões como conceitos . E esqueça as implementações específicas. A implementação varia, e deve variar, no mundo real, mesmo apenas em Java.