a description of a problem and its solution that you can apply to many similar programming situations
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