DEV Community

Cover image for A valid usage of Singleton Pattern (with Null object Pattern)
Sung M. Kim
Sung M. Kim

Posted on • Originally published at slightedgecoder.com on

A valid usage of Singleton Pattern (with Null object Pattern)

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.

  1. “If you have two versions of null objects, they should be identical, why waste memory to have same nothingness repeated”.
  2. 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)

Collapse
 
n_develop profile image
Lars Richter

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.

Collapse
 
dance2die profile image
Sung M. Kim

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 :)

Collapse
 
thejoezack profile image
Joe Zack • Edited

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!

Collapse
 
dance2die profile image
Sung M. Kim

Every pattern (or combination thereof) has a place in our heart ❤️/Code :)