Photo by Chetan Menaria on Unsplash
Singleton has a bad rep for being an anti-pattern.
You might have been burned bad with it.
I learned from Michael Outlaw from Coding Blocks podcast episode 16 that Singleton pattern can come in handy in conjunction with Null object pattern.
Let’s dive in.
🤔 Why implement a Null object as a singleton?
42 minutes into the Coding Blocks Episode 16, Michael Outlaw explains two reasons.
- “If you have two versions of null objects, they should be identical, why waste memory to have same nothingness repeated”.
- For equality checks – Each null object can be compared by reference.
Depending on a situation you might not even need to do a equality check as a null object usually does nothing (as you can see in the example below.)
TL;DR – You can stop reading here.
✍️ An Example Implementation
Here is an example of how you can use a Singleton pattern with a Null object pattern.
Suppose that there is a simple factory (PaymentStrategyFactory) that returns a strategy object instance for processing a payment given a provider name.
PayPal & ApplePay strategies return “Successful” or “Failed” process status at random.
If a provider name is not supported, the PaymentStrategyFactory
simply returns an object of type NullPaymentStrategy
, which implements IPaymentStrategy
.
Singleton instance is achieved with a private constructor and a static Instance
property.
Let’s put them together and process payments.
Results of ProcessPayments()
.
You can see that Braintree
& BadPaymentProvider
returns NoOp
because there PaymentStrategyFactory
returns a singleton instance NullPaymentStrategy.Instance
as there is no matching payment strategy.
👋 Conclusion
Googling Singleton Anti Pattern results in many reasons why Singleton pattern is bad.
But when used judiciously, it can improve your code quality/memory/speed.
Source code is available on GitHub.
Top comments (4)
Thanks for your cool post.
100% agree that there are not a lot of scenarios where a singleton is a good choice. But the "Null Object Pattern" is a good example for a useful use-case.
Keep up the great work.
You're welcome & thank you, Lars, for the comment.
I've heard lots of how Singleton is an anti-pattern for any cases. Just thought this was a refreshing concept to learn so shared :)
My boy singleton!!!
Great point as always, as much fun as I have picking on singletons they have their place and are (still) popular despite the downsides!
Every pattern (or combination thereof) has a place in our heart ❤️/Code :)