Nenhum padrão de design é necessário. Em qualquer idioma.
Eu costumo me deparar com um monte de código escrito por pessoas que lêem padrões de design e depois acham que devem usá-los em todo o lugar. O resultado é que o código real fica enterrado sob toneladas de interfaces, wrappers e camadas e é muito difícil de ler. Essa é uma abordagem errada para projetar padrões.
Existem padrões de design 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. Keep It Simple Stupid deve ser sempre o princípio de governo superior.
Também ajuda pensar em padrões de design como um conceito para pensar sobre o problema em vez de um código clichê específico para escrever. E sobre muito do clichê como solução alternativa para o Java sem funções gratuitas 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 toma uma função. Em vez de classe de fábrica, geralmente tenho apenas uma função de fábrica. Eu poderia dizer que eu tenho uma interface, mas então é apenas um par de métodos marcados com comentários, porque não haveria nenhuma outra implementação (claro que em python uma interface é sempre apenas comentários, porque é um tipo de pato). Eu ainda falo do código como usando o padrão, porque é uma maneira útil de pensar sobre isso, mas na verdade não digito todas as coisas até que eu realmente precise delas.
Então, aprenda all os padrões como conceitos . E esqueça as implementações específicas. A implementação varia e deve variar no mundo real, mesmo em Java.