What are Java Design patterns, their types and subtypes - Creational, Structural, Behavioral. Advantages of Design patterns in Java and when to use them