Most of the design patterns described here were first described in
[GHJV] Erich Gamma and Richard Helm and Ralph Johnson and John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Professional Computing Series, 1995.
The authors classified their patterns into three categories: