Design Patterns: Elements of Reusable Object-Oriented Software (1995)

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