What is a software design pattern?

John Moore

A design pattern is a solution to a general software problem within a particular context.

A recurring set of situations where the pattern applies.
A system of forces (goals and constraints) that occur repeatedly in this context.
A description of communicating objects and classes (collaboration) that can be applied to resolve those forces.
Design patterns capture solutions that have evolved over time as developers strive for greater flexibility in their software. Whereas class libraries are reusable source code, and components are reusable packaged objects, patterns are generic, reusable design descriptions that are customized to solve a specific problem. The study of design patterns provides a common vocabulary for communication and documentation, and it provides a framework for evolution and improvement of existing patterns.