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