Design patterns elements of reusable object-oriented software - Erich Gamma [et al] (Pearson Education Asia, New Delhi, 1995)