Class with static members vs singleton
Asked Answered
T

5

17

Isn’t a class with only static members a kind of singleton design pattern? Is there any disadvantage of having such a class? A detailed explanation would help.

Thissa answered 6/4, 2009 at 9:16 Comment(0)
L
18

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.

Lyricism answered 6/4, 2009 at 9:30 Comment(4)
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.Hackett
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?Hackett
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.Minima
First link is broken. Perhaps update with this one? wiki.c2.com/?MonostatePatternVirge
M
15

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

Minima answered 6/4, 2009 at 9:21 Comment(3)
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++?Hackett
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.Minima
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.Minima
M
2

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.

Monoplane answered 6/4, 2009 at 12:35 Comment(0)
U
1

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.

Underslung answered 6/4, 2009 at 9:34 Comment(2)
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 singletonUnderslung
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.Underslung
S
1

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.

Sneak answered 6/4, 2009 at 10:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.