Design patterns : elements of Reusable Object-Oriented Software - Gamma, Erich, (Addison-Wesley, 1995)