Software Design Principles, Design Patterns &
Architectural Styles
1. Software Design Concepts
These ideas help organize and structure software:
Abstraction – Focus on important details; hide complexity
Modularity – Break software into smaller parts (modules)
Encapsulation – Hide internal data; expose only needed methods
Separation of Concerns – Each part handles one job only
These reduce complexity and make software easier to maintain.
2. Software Design Principles
Guidelines that help developers and designers create software that is maintainable, scalable,
efficient, and robust:
SOLID Principles
S – Single Responsibility: One class = one job
O – Open/Closed: Extend code without changing it
L – Liskov Substitution: Subclasses should work like parent classes
I – Interface Segregation: Don’t force classes to use unnecessary functions
D – Dependency Inversion: Depend on interfaces, not concrete classes
Other important principles
DRY – Don’t repeat code
KISS – Keep things simple
YAGNI – Don’t build features you don’t need
High cohesion, low coupling – Related code stays together; modules depend less on
each other
Composition over inheritance – Combine objects instead of deep inheritance chains
3. Design Patterns
Design patterns are reusable solutions or templates used in software development. In the context of
software reuse, design patterns help reduce development time and improve software quality. They
represent standard ways of solving recurring design problems, and they are considered reusable
artefacts alongside components and frameworks.
4. Architectural Styles
Ways to structure an entire software system.
(1) Layered Architecture
Example: MVC (Model–View–Controller)
Easy to understand
Good for simple/medium systems
Harder to scale for large systems
(2) Component-Based Architecture
System made of independent components
Flexible and scalable
More complex to build
(3) Microservices Architecture
System split into very small services
Highly scalable and flexible
Most complex to manage