Design Patterns: Elements of Reusable Object-Oriented Software - Erich Gamma (New Delhi Pearson, 1994)