Programmers often run into coding problems that repeatedly arise during software design and implementation. Some of these problems are subtle, producing a cascading effect of small errors that can terminate in an eventual software crash. A software design pattern provides a solution to familiar interaction problems by providing a stable template that can be reused in different situations. It is not a complete code that can be plugged into a body of software as a whole, it is a circumstance that is likely to occur and the rules that solve the problem. A pattern language is a set of such patterns that combine to support an architectural style, a framework of related software systems.
Each pattern consists of three parts within a body of code; a context, a problem that routinely occurs, and a solution to that problem. Wherever the context occurs, the same rules must be applied to address the problem in that particular instance. Pattern languages are often developed specifically to support the building of large, complicated systems, documenting each potential problem and its solution into a knowledge for all programmers on the team to use and apply. This documentation includes situations, or context, in which a pattern may be used, the problem within the context that may arise without solution, and suggested solutions to address the problem. While some patterns are endemic to a single software architecture, others occur so commonly that developed pattern languages can be published or made available online as a resource to be used as a starting point for new project development.
To learn more about patterns and pattern languages: