Design patterns: elements of reusable object-oriented software. (1995)

by E Gamma, J Vlissides, R Johnson, R Helm