Design Patterns for Object-Oriented Software Development