Desing patterns : elements of reusable object-orinted software - Gamma, Erich. (Addison-Wesley, 2001)