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

by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides