a general reusable solution to a commonly occurring problem within a given context in software design
an established general solution to a commonly occurring software development problem
reuses abstract knowledge about a problem and its solution, makes use of object oriented characteristics such as inheritance and polymorphism