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