Software Engineering
Elements of Reusable Object-Oriented Software
Erich Gamma
Capturing a wealth of experience about the design of object-oriented software.