Design Patterns: Elements of Reusable Object-Oriented Software - Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (Bangalore Addison Wesley Longman Inc., 1995)