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