Software Design Patterns in Java