Design Patterns for Object Oriented Software