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