I have just recently begun studying the intersection of game programming and design patterns. I welcome any links that others may provide. My results are preliminary, but thus far, I have found the State and Visitor patterns to be easily applicable to game programming: State to maintain sprite and game status and Visitor to encapsulate class-specific behavior outside of the inheritance hierarchy. These two patterns are defined in the classic GoF book (Design Patterns, Gamma et al.), although I highly recommend the presentation in Holub on Patterns (Allen Holub). Depending on how the rest of the summer goes, I’m hoping to start writing a paper on this subject, and I’ll try to remember to post a followup then. In the meantime, feel free to check out my eeclone game, which was designed specifically to explore some design patterns in game programming: http://www.cs.bsu.edu/~pvg/games/eeclone.
Regardless of how well one does on tests, I believe that it is never to early to study design patterns. Don’t put it off until an undergraduate course on software engineering – it is one of the most interesting and applicable aspects of modern computer science, and it is generally not given its due in education. (In fact, I will be teaching our introductory computer science course next semester with an early emphasis on OO principles and patterns.)
The “program to interfaces” concept is central to design patterns. Even if you don’t have the opportunity to delve into design patterns now, keep that idiom in mind, and you will probably trip across patterns without knowing it.
It is also worth noting that “design patterns” has a wider usage than I am discussing here. My interest is in design patterns for software engineering, specifically for software design. This seems to be the domain of your question. Others have discussed design patterns for game design, which has little or nothing to do with game implementation. For example, one could apply good game design patterns to create a board game, since they deal with game flow, keeping player interest, fun, etc.
Also, there is nothing wrong with singletons if they are used correctly. Like any pattern, it should only be used when applicable. A misuse of any programming idiom or pattern will lead to headaches! For example, the sound engine in EEClone is a singleton. There is only one interface to the sound card that I use, and I need to manage what sounds have started or stopped, the number of pooled threads, etc. Singleton is a natural fit.
Cheers!