Patterns in Java by Mark Grand