An abstraction in which common code providing generic functionality can be selectively overridden or specialized by user code, thus providing specific functionality
A special case of software libraries in that they are reusable abstractions of code wrapped in a well-defined Application Programming Interface
A collection of resources to generate the code to achieve a generic functionality
A template to show how things should be done consistently