Design Patterns: Elements of Reusable Object-Oriented Software
Erich Gamma & Richard Helm & Ralph Johnson & John Vlissides