Software Engineers Handbook/Life Cycle/Design/Patterns

A software design pattern is a general reusable solution to a problem that repeats itself in software design within a given context. It is not a finished design that can be transformed directly into code, and constitutes a description or template for a problem that can be used in many different situations. Software design patterns are formalized best practices that have to be implemented in applications. A part of the software design patterns are object-oriented design patterns that show relationships and interactions between classes or objects without specifying the final application objects that are involved. Patterns that imply object-orientation or more generally mutable state, are not as applicable in functional programming languages.

Software design patterns reside in the domain of modules and interconnections. At a higher level there are architectural patterns that are larger in scope. These usually describe an overall pattern followed by an entire system.

Important design pattern types are
 * Behavioural patterns
 * Concurrency patterns
 * Creational patterns
 * Structural patterns