Originally published on September 9, 2009 and updated on July 6, 2023.
Introduction to Design Patterns: Provider and Strategy
As software developers, we often come across recurring solutions to common problems, known as design patterns. These patterns provide us with a shared language, making our communications more efficient and precise. In this realm of patterns, two that often come up for discussion are the “Provider Model” and the “Strategy” pattern. At first glance, they seem distinctly different, but are they really?
Exploring the Provider Model Pattern
To understand this, let’s start by dissecting the Provider Model pattern. According to the technical documentation on Microsoft’s Developer Network (MSDN), the Provider Model pattern is characterized by its role as a functionality provider for an API. It acts as a contractual binding between the API and the Business Logic/Data Abstraction Layer. Put simply, the Provider is an implementation of the API that operates independently from the API itself.
Illustrating the Provider Model: The ‘Whidbey Membership’ Feature
To illustrate this, let’s take a look at the ‘Whidbey Membership’ feature. This feature contains a static method called Membership.ValidateUser(). However, this method does not embed any business logic. Instead, it forwards the call to a configured provider. It then becomes the responsibility of the provider class to implement the method and call whatever Business Logic Layer (BLL) or Data Access Layer (DAL) is necessary.
Something like this:
Understanding the Strategy Pattern
On the surface, this concept seems innovative and efficient. We’re presented with an abstract API, and all that’s required of us is to create a concrete implementation of it. This allows the calling code to use our implementation. However, there’s a twist that often gets overlooked.
Comparing Strategy and Provider Model Patterns
To bring this twist to light, we need to delve into the Strategy pattern. The Strategy pattern is particularly useful in scenarios where it is necessary to dynamically swap the algorithms used in an application. The pattern provides a means to define a family of algorithms, encapsulate each one as an object, and make them interchangeable. This allows the algorithms to vary independently from the clients that use them.
Emphasizing the Role of Design Patterns in Application Design
When we closely compare the Strategy pattern and the Provider Model pattern, the similarities are striking. The Strategy pattern explicitly talks about using interfaces, and the Provider Model pattern uses abstract classes, but fundamentally, they are the same. Both patterns have an interface which is then implemented by any number of providers that can be interchanged as needed.
The Importance of Design Patterns in Software Development
The key takeaway here is that design patterns are not something we construct our applications around. They are existing solutions that we observe and incorporate after they have been implemented in an application. As developers, we need to strive to describe what we have using the patterns that already exist. This is crucial because if we fail to recognize and reuse existing patterns, we risk losing the main purpose of having patterns in the first place. That purpose being: to allow software engineers to communicate design without having to specify everything in painstaking detail.
I hope this discussion has clarified the Provider Model pattern, and shed light on its relationship with the Strategy pattern. In the ever-evolving field of software development, understanding and utilizing such design patterns is key to efficient and effective communication, as well as robust application design. Have you used the Provider Model or Strategy patterns in your projects? What has been your experience?
If you’re interested in exploring more about design patterns or other aspects of software development, feel free to check out our other blog posts. Stay tuned for more insights and discussions on the latest trends and topics in software design and development.
Loved the article? Hated it? Didn’t even read it?
We’d love to hear from you.
Yes, this kind of NIH syndrome is sad and it happens in many other places in the MSFT world.
I once had to hear a 100%-MSFT consultant which I otherwise respect say that the PoEAA have "no real world application"… after having been discussing LINQ to SQL (!)
I always thought that this [i]same [/i]pattern was known by two names:
http://www.codersbarn.com/post/2008/09/22/ASPNET-Email-Strategy-Pattern.aspx
So the problem is one of terminology?
At least in this case, they aren’t just inventing patterns (and practices) — http://serialseb.blogspot.com/2009/01/how-to-fix-microsofts-two-tier-service.html
It’s all about terminology. And as I’ve said before one don’t need to knows the names of all the patterns to use them. This is just the case.
Microsoft just came up with a good solution, which appeared to be a strategy pattern.
I agree with Mike that it’s all about terminology; but that’s exactly why it is important not to re-name existing patterns. One of the points of patterns is to recognize common solutions and establish a common language to describe them between developers; if everyone uses their own brand of pattern-naming, then you are back to step zero, that is, a babel tower of confusion, and you might as well scrap the idea of patterns.
@Mike and @Mathias Yep, and that is exactly what I said at the bottom of the post. Patterns are mostly about expressing a shared lexicon that allows us to communicate effectively with other developers. Very few patterns are used consciously, but most often they are either noticed in implementations we have already built, or refactored to later when we realize that another pattern would have suited us better.
Renaming patterns destroys their value, because it now makes it harder for a Microsoft developer to talk to a Java developer because when people write about the "Provider Model" pattern, they are no longer using an industry standard term.
True, I did paraphrase your last paragraph; I just wanted to clarify where I agreed and disagreed with Mike: it’s certainly important that people write good code following patterns, even if they don’t know what the pattern is, but that’s only half the point of patterns, which as you clearly stated, are first and foremost a language, so knowing patterns names is important.
That being said, I think the real annoying thing is that this comes from Microsoft. It’s fine for a random developer not to know the proper names, but it’s not acceptable for Microsoft to write something on patterns and contribute to the confusion!
Thx for this post. I fully agree!
Agreed, renaming patterns does cause a great deal of confusion. The one thing that I did appreciate from this "Provider Model Pattern" of theirs is how you can leverage it to provide a configurable factory implementation.
Sure, it’s obviously Strategy-based, but it can be used to provide a clean way for configuring instances if you’re not using an IoC container.
Following up to Josh’s comment – it is really a combination of the Factory Pattern and the Strategy Pattern. It’s a Meta-Pattern. lolz 😉
Actually, isn’t the Provider model also referred to as the Abstract Factory design pattern?
Great post, Justin. I’m using the provider model pattern in the current project with my team and we discussed the same thing a few weeks ago 🙂
Provider Model is like someone else mentioned, it is a combination of a factory and strategy. Or you might call it encapsulating a strategy pattern. In the same sense, couldn’t you say that a factory is just a strategy pattern?
Just like MVC pattern isn’t a real pattern, but 3 separate patterns put into one. Provider model is a strategy and factory, and dependency injection / IoC rolled into one.
I normally do not comment… especially about rants because most of the time it is a waste of time… however… in case this time is different… here goes…
While there is a similarity between the Strategy pattern and the Provider patter there are some differences… which you may or may not consider important. At first I thought you were headed down the path of pointing out that the Provider pattern really is just polymorphism and while that is close also… it again is not exactly the same. In either case, this kind of misses the point of why patterns are important… and why I very much agree that changing a pattern’s name does completely go against the main goal of patterns.
Patterns help build understanding quickly. If two people fully understand a pattern… one just has to say that we need to build a component using the [fill in the blank] pattern and no more communication needs to happen… at least as far as HOW the component should be designed. So what patterns provide is a way of quickly communicating a lot of detail information quickly. It expands our vocabulary.
Now as for why I believe the Provider pattern is not a bad pattern to add to our (the developer community’s vocabulary) is because it conveys a lot more details on HOW to construct a component quickly.
If I asked a fellow developer to build a new component using the Strategy pattern we would end up with a fundamentally different component than if they used the Provider pattern. The component would have each public method pluggable independently from the others.
If I asked a developer to build a new component using the Provider pattern it would have the ability to swapped out the implementation of all of the public methods and properties as a unit… plus a way to locate alternate implementations (not that I find this part of the pattern particularly useful).
This may or may not be a significant difference to you but to me it is nice to have that addition in our vocabulary so that I do not have to explain every implementation detail.
To illustrate this a little more. If I have a friend that has 2 vehicles (a Smart car and a pickup truck). If I ask him to bring his vehicle over to my house… he has an option… does he bring the pickup truck or his Smart car? If I am not more explicit and do not tell him why he should bring a particular vehicle then he is free to choose which one he brings. But if I care… I should ask him to bring a specific vehicle.
For me, I care about the difference between the Strategy pattern and the Provider… but I can definitely appreciate the fact that not everyone does.
Great post!
It got me thinking…
One distinction [with a little difference 😉 maybe!] The Provider pattern applies to system-level concerns, i.e. at the API level while the Strategy pattern applies to the class/object level. Extending this … to the language level would be polymorphism.