What is a Design Pattern?
A design pattern is a re-usable form of a solution to a design problem. It helps us by not having to re-invent the wheel when we design and code solutions.
Finding the right fit is crucial: A) Using the wrong pattern for a problem can cause more problems; and B) Using a pattern for a trivial problem is overkill and, thus, costly. Along this line, there is a term, anti-pattern, for a common response to a recurring problem that is typically ineffective and counterproductive.
It is my opinion that the patterns need not be memorized. What is most important that their concepts be understood enough to know when they should be applied. It is useful to review the various explanations and code samples when beginning a new design with a fresh perspective. They also come in very handy when refactoring existing code.
So as not to reinvent the wheel myself, please see the following references for more information.
Where are some Good References?
- Gang of Four: http://c2.com/cgi/wiki?DesignPatternsBook
- C# source code: http://www.dofactory.com/net/design-patterns
- Andras Nemes: http://dotnetcodr.com/architecture-and-patterns/
- A Learning Guide: https://www.industriallogic.com/papers/learning.html
- Microsoft: https://msdn.microsoft.com/en-us/library/ff921345.aspx
- Beginner's Guide (PHP): http://code.tutsplus.com/articles/a-beginners-guide-to-design-patterns--net-12752
- Martin Fowler: http://martinfowler.com/eaaCatalog/
- Scott Ambler: http://www.ambysoft.com/onlineWritings.html#Patterns
- Head First Design Patterns (O'Reilly) (C#): https://hfpatternsincsharp.codeplex.com/
- Wikipedia: https://en.wikipedia.org/wiki/Design_pattern
- Enterprise Integration Patterns: https://en.wikipedia.org/wiki/Enterprise_Integration_Patterns
- Documenting good education and training practices through design patterns: http://ifets.ieee.org/discussions/discuss_june2004.html
- Robert C Martin (Uncle Bob): http://www.objectmentor.com/omTeam/martin_r.html (Scroll down to his Selected Publications)
- Related to Patterns are Principles:
- DRY: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
- GRASP: https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)
- KISS: https://en.wikipedia.org/wiki/KISS_principle
- Package: https://en.wikipedia.org/wiki/Package_principles
- SOLID: https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
- YAGNI: https://en.wikipedia.org/wiki/You_aren't_gonna_need_it