Introduction
- What design patterns are
- Why would you want to learn design patterns
- Why design patterns are hard to learn
- The goal of this book
- The structure of this book
About the author and his mission
- Getting in touch
- Helping to spread the word
UML conventions used in the book
- Basic component
- Association
- Dependency
- Implementation
- Inheritance
Part 1: SOLID principles and why they are important
1. Single responsibility principle
- What is single responsibility principle
- The importance of the single responsibility principle
- The concept of class cohesion
- Conclusion
2. Open-closed principle
- What is open-closed principle
- Implementing the open-closed principle in C#
- Conclusion
3. Liskov substitution principle
- Implementing Liskov substitution principle in C#
- Conclusion
4. Interface segregation principle
- What is interface segregation principle
- Importance of interface segregation
- When NotImplementedException is appropriate
5. Dependency inversion principle
- What is dependency inversion principle
- Why the dependency inversion principle is important
- Dependency inversion is not only useful in unit tests
Part 2: The problems that design patterns are intended to solve
6. Not knowing what object implementations you’ll need ahead of time
- Suitable design patterns
7. Making several exact copies of a complex object
- Suitable design patterns
8. Using many instances of an object while keeping code running smoothly
- Suitable design patterns
9. Using the same single instance of an object throughout the application
- Suitable design patterns
10. Third-party components aren’t directly compatible with your code
- Suitable design patterns
11. Adding new functionality to existing objects that cannot be modified
- Suitable design patterns
Accessing complex back-end logic from the presentation layer
- Suitable design patterns
13. User interface and business logic are developed separately
- Suitable design patterns
14. Building a complex object hierarchy
- Suitable design patterns
15. Implementing complex conditional logic
- Suitable design patterns
16. Multiple object instances of different types need to be able to communicate with each other
- Suitable design patterns
17. Multiple stages of processing are needed
- Suitable design patterns
18. The system is controlled by complex combinations of inputs
- Suitable design patterns
19. Ability to undo an action that has been applied
- Suitable design patterns
20. Ability to traverse a collection without knowing its underlying structure
- Suitable design patterns
21. Creating a family of related algorithms
- Suitable design patterns
22. Summary of the problems design patterns are intended to solve
Part 3: Design patterns demonstrated in C#
23. Design pattern categories
Creational design patterns
24. Factory Method
- Prerequisites
- Factory Method implementation example
- Benefits of using Factory Method
- Caveats of using Factory Method
25. Abstract Factory
- Prerequisites
- Abstract Factory implementation example
- Benefits of using Abstract Factory
- Caveats of using Abstract Factory
26. Builder
- Prerequisites
- Builder implementation example
- Benefits of using Builder
- Caveats of using Builder
27. Prototype
- Prerequisites
- Prototype implementation example
- Benefits of using Prototype
- Caveats of using Prototype
28. Singleton
- Prerequisites
- Singleton implementation example
- Benefits of using Singleton
- Caveats of using Singleton
Structural design patterns
29. Adapter
- Prerequisites
- Adapter implementation example
- Benefits of using Adapter
- Caveats of using Adapter
30. Bridge
- Prerequisites
- Bridge implementation example
- Benefits of using Bridge
- Caveats of using Bridge
31. Composite
- Prerequisites
- Composite implementation example
- Benefits of using Composite
- Caveats of using Composite
32. Decorator
- Prerequisites
- Decorator implementation example
- Benefits of using Decorator
- Caveats of using Composite
33. Facade
- Prerequisites
- Facade implementation example
- Benefits of using Facade
- Caveats of using Facade
34. Flyweight
- Prerequisites
- Flyweight implementation example
- Benefits of using Flyweight
- Caveats of using Flyweight
35. Proxy
- Prerequisites
- Proxy implementation example
- Benefits of using Proxy
- Caveats of using Proxy
Behavioral design patterns
36. Chain of Responsibility
- Prerequisites
- Chain of Responsibility implementation example
- Benefits of using Chain of Responsibility
- Caveats of using Chain of Responsibility
37. Command
- Prerequisites
- Command implementation example
- Benefits of using Command
- Caveats of using Command
38. Iterator
- Prerequisites
- Iterator implementation example
- Benefits of using Iterator
- Caveats of using Iterator
39. Mediator
- Prerequisites
- Mediator implementation example
- Benefits of using Mediator
- Caveats of using Mediator
40. Memento
- Prerequisites
- Memento implementation example
- Benefits of using Memento
- Caveats of using Memento
41. Observer
- Prerequisites
- Observer implementation example
- Benefits of using Observer
- Caveats of using Observer
42. State
- Prerequisites
- State implementation example
- Benefits of using State
- Caveats of using State
43. Strategy
- Prerequisites
- Strategy implementation example
- Benefits of using Strategy
- Caveats of using Strategy
44. Template Method
- Prerequisites
- Template Method implementation example
- Benefits of using Template Method
- Caveats of using Template Method
45. Visitor
- Prerequisites
- Visitor implementation example
- Benefits of using Visitor
- Caveats of using Visitor