An Introduction to Design Patterns