Design patterns: Elements of reusable object-oriented software (1994)

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