Design patterns : elements of reusable object-oriented software - Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (Addison-Wesley professional computing, 1995)