5 Design Patterns Every Engineer Should Know