Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can the Singleton be replaced by Factory?

There are already quite some posts about the Singleton-Pattern around, but I would like to start another one on this topic since I would like to know if the Factory-Pattern would be the right approach to remove this "anti-pattern".

In the past I used the singleton quite a lot, also did my fellow collegues since it is so easy to use. For example, the Eclipse IDE or better its workbench-model makes heavy usage of singletons as well. It was due to some posts about E4 (the next big Eclipse version) that made me start to rethink the singleton.

The bottom line was that due to this singletons the dependecies in Eclipse 3.x are tightly coupled.

Lets assume I want to get rid of all singletons completely and instead use factories.
My thoughts were as follows:

  • hide complexity
  • less coupling
  • I have control over how many instances are created (just store the reference I a private field of the factory)
  • mock the factory for testing (with Dependency Injection) when it is behind an interface
  • In some cases the factories can make more than one singleton obsolete (depending on business logic/component composition)

Does this make sense? If not, please give good reasons for why you think so. An alternative solution is also appreciated.

Thanks

Marc

like image 693
lostiniceland Avatar asked May 04 '10 11:05

lostiniceland


People also ask

What can I replace singleton with?

Static singleton void method could be replaced with: Dependency. Resolve<IFoo>(). DoSomething();

Can a factory be a singleton?

I've a lot of (abstract) factories and they're usually implemented as singletons. Usually for the convenience of not having to pass them through layers who really have no business with using or knowing these factories.

Can singleton be destroyed?

The true, non monobehaviour singleton can't really be destroyed or reinitialized as the static field is read only. If you need this you have to do the usual singleton approach with a normal private static variable. To force a reinitialization you just add a method "Destroy" which sets the static reference to "null".

Why do we need to use singleton factory?

The purpose of the Singleton Design pattern is to return the same object over and over to the caller. Singleton would be useful when you need to have an access to same object in the different part of an application.


1 Answers

I agree that it makes senses sometimes. However, it depends on what you're building.

If you replace every single singleton with a factory just because its "better", you're doing it wrong imho. It should serve a purpose. If you're not going to mock, if you're sure you only need one instance, etc than replacing is just "architectural mastrubation" ;)

Dont get me wrong, architecture is very important, but you shouldn't overdo it.

like image 145
Henri Avatar answered Oct 16 '22 14:10

Henri