Design Patterns with Java: An Introduction