Software Architecture Design Patterns in Java