This doesn't look like the Singleton pattern. The way I understand it, you're passing an object with references to important game-objects to all of your instances.
If this would be the Singleton pattern, you would have:
AudioManager.getInstance().playSound(XY);
Whereas in your case you might have:
this.gateway.getAudioManager().playSound(XY);
It looks basically the same, but it really isn't. If you would want to replace AudioManager
with a new (extended class) like ExtendedAudioManager
, you would hit a wall using the Singleton pattern. Your gateway approach will handle that just fine though.
The drawback of your approach is that you'll have to pass around the gateway
everywhere.
The service locator pattern (proposed by Joe Wreschnig in this thread), looks like a good replacement for your "gateway pattern".
Sometimes it's better to just run with the simple and straightforward method instead of over-designing things though. Especially when it's a small project or a prototype.
Maybe you could make that gateway
some sort of a global variable.. eg. Game.gateway
and run with it.