A general reusable solution to a commonly occurring problem within a given context in software design. Object-oriented design patterns typically show relationships and interactions between classes or objects, without specifying the final application classes or objects that are involved.