Design patterns: Elements of reusable object-oriented software - Gamma, Erich (Pearson, 2002)