Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, John M. Vlissides, Ralph Johnson, Richard Helm (Hardback, 1994)