Já ouvi inúmeras vezes sobre as armadilhas dos singletons / globais, e entendo por que eles são tão frequentemente desaprovados.
O que não entendo é qual é a alternativa elegante e não bagunçada. Parece que a alternativa ao uso de Singletons / globais sempre envolve a passagem de objetos em um milhão de níveis através dos objetos de seu mecanismo até que eles atinjam os objetos que precisam deles.
Por exemplo, no meu jogo, pré-carrego alguns ativos quando o jogo é iniciado. Esses ativos não são usados até muito mais tarde, quando o jogador navega pelo menu principal e entra no jogo. Devo passar esses dados do meu objeto Game, para o meu objeto ScreenManager (apesar de apenas uma tela realmente se importar com esses dados), para o objeto Screen apropriado e para qualquer outro lugar?
Parece que estou trocando dados de estado global por injeção de dependência desordenada, passando dados para objetos que nem se importam com os dados, exceto com o objetivo de repassá-los a objetos filho.
Este é um caso em que um Singleton seria uma coisa boa ou há alguma solução elegante que me falta?