I believe this is the third time I read Design Patterns: Elements of Reusable Object-Oriented Software – by Erich Gamma, Ralph Johnson, Richard Helm and John Vlissides. This is the first time I bother to review a book I have read before, but this is such a classic it is hard to avoid.
The Wikipedia definition of a design pattern is a “general reusable solution to a commonly occurring problem within a given context in software design”. The point of the book is cataloging the most generic and useful patterns. Most patterns also have little analysis of details on ways you could implement them.
Every time I read this I appreciate it more, and come up with better ideas on how to improve the design of my classes.
Some people seem to think it is too heavy and technical. Personally I like it, but if you want something lighter, check out Design Patterns Explained: A New Perspective on Object-Oriented Design (which I am stunned to realize I never got around to reviewing), which is a simpler review of design patterns.