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