Design Patterns: Elements of Reusable Object-Oriented Software is a book written by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides1. The book was published by Addison-Wesley Professional in 1994 and has 416 pages. The book is a catalog of 23 patterns that can be used to solve commonly occurring design problems in object-oriented software.
The authors describe the circumstances in which each pattern is applicable when it can be applied in view of other design constraints and the consequences and trade-offs of using the pattern within a larger design. The book includes downloadable C++ source code that demonstrates how patterns can be implemented and Python.