Design patterns :elements of reusable object -oriented software - Erich Gamma (Pearson Education, 2004)