With C# code samples using .NET 6 templates
Fiodar Sazanavets

#Design_patterns
#C#
#.NET
#6
One thing that makes you truly stand out as a software engineer is a good knowledge of design patterns. Knowing them makes you quicker at solving problems. It makes you much better at understanding architecture. And it significantly improves your chances of landing a good job, as it makes you better at solving problems during technical interviews.
But the biggest problems with the design patterns is that they are hard to learn. Most of them are not very intuitive. Therefore getting to understand them at the level where you can use them usually takes long time. Many developers just give up, which prevents them from unlocking their full potential.
This book aims to solve this problem. It takes a very different approach from how design patterns are normally taught. It does it by providing sufficient context first. Instead of jumping into the UML diagrams and code samples, the book provides descriptions of real-life software engineering challenges that developers can easily relate to. For each of these scenarios, appropriate design patterns are listed with a summary of how each of them can solve a given problem. And only then, when sufficient context has been provided, we jump into the code examples.
The process of effective learning is not about memorization. It's about adding new associations to the existing knowledge. And this is the approach this book has taken.
Because of its structure, this book can also be effectively used as a reference source. It allows you to look up an appropriate design patterns as you are facing a problem of a particular type.
Table of Contents
Part 1: SOLID principles and why they are important
1. Single responsibility principle
2. Open-closed principle
3. Liskov substitution principle
4. Interface segregation principle
5. Dependency inversion principle
Part 2: The problems that design patterns are intended to solve
6. Not knowing what object implementations you'll need ahead of time
7. Making several exact copies of a complex object
8. Using many instances of an object while keeping code running smoothly
9. Using the same single instance of an object throughout the application
10. Third party components aren't directly compatible with your code
11. Adding new functionality to existing objects that cannot be modified
12. Accessing complex back-end logic from the presentation layer
13. User interface and business logic are developed separately
14. Building a complex object hierarchy
15. Implementing complex conditional logic
16. Multiple object instances of different types need to be able to communicate with each other
17. Multiple stages of processing are needed
18. The system is controlled by complex combinations of inputs
19. Ability to undo an action that has been applied
20. Ability to traverse a collection without knowing its underlying structure
21. Creating a family of related algorithms
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
25. Abstract Factory
26. Builder
27. Prototype
28. Singleton
Structural design patterns
29. Adapter
30. Bridge
31. Composite
32. Decorator
33. Facade
34. Flyweight
35. Proxy
Behavioral design patterns
37. Command
36. Chain of Responsibility
38. Iterator
39. Mediator
40. Memento
41. Observer
42. State
43. Strategy
44. Template Method
45. Visitor
About the Author
Fiodar Sazanavets is an experienced full-stack lead software engineer who mainly works with Microsoft software development stack. The main areas of his expertise include ASP.NET (Framework and Core), SQL Server, Azure, Docker, Internet of Things (IoT), microservices architecture and various front-end technologies.
Fiodar has built his software engineering experience while working in a variety of industries, including water engineering, financial, retail, railway and defence. He has played a leading role in various projects and, as well as building software, he gained substantial experience in architecture and design. He has also performed a variety of technical duties on clients' sites, such as in-house software development and deployment of both software and IoT hardware.
Fiodar is passionate about teaching other people programming skills. He has published a number of books and programming courses.









