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