Design Pattern references from http://www.tutorialspoint.com/design_pattern/design_pattern_quick_guide.htm