Design Patterns for Software Developer and Architect
Design patterns provide a structure in which problems can be solved. When solving a real problem, you have to consider many small variations of a solution to that problem to see whether any fits a design pattern.
To understand and get used to design patterns is really difficult. It can be done by studying applications of design patterns, not just the patterns. Reading several books with different perspective is really important.