Design patterns : elements of Reusable Object-Oriented Software - Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (Addison-Wesley, 1995)