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