Common software architectural patterns