SOFTWARE DESIGN PATTERNS