Design patterns : elements of reusable object-oriented software. - Gamma, Erich (Addison-Wesley, 2003)