a description of a problem and its solution that you can apply to many similar programming situations
a written document that describes a general solution to a design problem that recurs repeatedly in many projects
reuses abstract knowledge about a problem and its solution, makes use of object oriented characteristics such as inheritance and polymorphism