views:

1146

answers:

5

Isn't a class with all static members/methods a kind of singleton design pattern? Is there any disadvantage in particular of having such classes? A detailed explanation would help.

+11  A: 

Robert C. Martin wrote an article some times ago about the differences between the mono state pattern and the singleton pattern.

Luc Hermitte
Based on the article, the only material differences that I could see were that in Java, destruction of a Monostate is guaranteed but it cannot be passed between JVMs -- are there any differences relevant to C++?
j_random_hacker
It's exactly the same as with other variables. If it is dynamically allocated, it should be deallocated with a compatible deallocator. If it is in the static storage (see GOTW/XC++, IIRC), it will be destroyed and the end of the program, but there is no way to implement dependencies.
Luc Hermitte
Regarding the dependencies aspect, A.Alexandrescu's loki (from MC++D) singletons, and ACE singletons permit to specify dependencies. BTW, they are both non intrusive singletons.
Luc Hermitte
May you comment the -1 ?
Luc Hermitte
No -1 from me... In fact I'll give you a +1 for the informative comments :)
j_random_hacker
Of course. :) I meant to address my question to the one who vote the answer down.
Luc Hermitte
+9  A: 

This kind of class is known as a monostate - it is somewhat different from a singleton.

Why use a monostate rather than a singleton? In their original paper on the pattern, Bell & Crawford suggest three reasonns (paraphrased by me):

  • More natural access syntax
  • singleton lacks a name
  • easier to inherit from

I must admit, I don't find any of these particularly compelling. On the other hand, the monostate is definitely no worse than the singleton.

anon
Different yes, but doesn't it achieve exactly the same thing? I can't see how this has any advantages or disadvantages over the "traditional" singleton, in C++ at least.
j_random_hacker
There is the difference that space will not be allocated for a singleton unless it is used, but in practice a singleton object that is never used seems like a rare case. Does anyone have a common use-case where this would be important?
j_random_hacker
I also tend to think that the lazy-construction feature of typical singletons is useless in most cases -- those where we just need a global variable. However, in library case, we may need an on-the-fly construction in order to simplify the end-user's (developer actually) code.
Luc Hermitte
Thanks for the update, +1.
j_random_hacker
A: 

For a singleton all constructors have to be private, so that you can access only through a function. But you're pretty close to it.

DaClown
wrong wrong wrong.
Thomasz
If you really think that you should read about singletons again. Private constructors and one or more static members only accessilbe through a public member function is the very definition of a singleton
DaClown
If this answer is so wrong that it deserves 5 downvotes, could you leave a comment why? Something like 'wrong wrong wrong' is not helpful and I'm still not convinced that I'm wrong.
DaClown
+1  A: 

class with all static members/methods a kind of singleton design pattern

Class - not pattern. When we talk about classes we can say class implements pattern.


Static functions - is not member functions, they are similar on global functions. Maybe you don't need any class?

Quote from wikipedia:

In software engineering, the singleton pattern is a design pattern that is used to restrict instantiation of a class to one object.

By this definition your implementation is not singleton implementation - you don't use common idea One (or several in extended definition) instance of class.

But sometimes (not always) usage of class with all static functions and singleton pattern - not have meaningful difference.

bb
+1  A: 

Consider a family of Logging classes. They all implement "LogMessage(message, file, line_number). Some send messages to stderr, some send email to a set of developers, some increment the count of the particular message in a message-frequency table, some route to /dev/null. At runtime, the program checks its argument vector, registry, or environment variables for which Logging technique to use and instantiates the Logging Singleton with an object from a suitable class, possibly loading an end-user-supplied DLL to do so. That functionality is tough to duplicate with a pure static Singleton.

Thomas L Holaday