2012-10-03 2 views

Répondre

2

D'abord, singletonobj est un nom faux/confus. Singletons sont appelés sur une base de classe, comme:

Log::getInstance().doSomething(); 

et non

Log log = new Log; 
log.getInstance().doSomething(); 

Donc, cela devrait répondre à la question, mais je vais quand même :) détail

Log::doSomething(); 

forcerait doSomething() pour être une méthode statique, tandis que

Log::getInstance().doSomething(); 

a doSomething() comme méthode d'instance.

Pourquoi utiliser getInstance()? Parce qu'un singleton, par sa définition même, ne devrait avoir que zéro ou une instance. En rendant le constructeur d'un singleton privé et en publiant la méthode getInstance(), il vous permet de contrôler le nombre d'instances de cette classe. Le constructeur privé est simplement pour éviter que d'autres classes utilisent cette classe, ce qui irait à l'encontre du but de cette classe étant un singleton, car vous ne seriez pas capable de contrôler le nombre d'instances de cette classe.

+2

Vous avez raté la balise C++ –

+0

Vous savez que la question concerne le C++, n'est-ce pas? –

+0

Ouais, n'a pas vu. Quoi qu'il en soit, seule la syntaxe et les détails changent. Le concept est le même. – m0skit0

1

Il semblerait que le premier exemple appelle une méthode régulière, alors que le second exemple appelle une méthode statique.

Le motif de conception Singleton garantit qu'une seule instance d'un objet donné est instanciée à un moment donné. Le premier exemple renvoie cette instance, puis appelle une méthode à l'aide d'une instance d'un objet.

Le deuxième exemple semble utiliser une méthode statique qui ne nécessite pas une instance d'un objet et invalident en fait le design pattern singleton ...

+1

Je ne vois pas comment cela invalide quoi que ce soit. –

+0

@ Joschc1107 - Je m'attends à ce que 'singletonobj' soit ** l'instance unique. Donc 'singletonobj.getinstance() 'renvoie probablement' singletonobj' à nouveau. Qui, bien que redondant (et montrant un assez grand écart dans la compréhension de l'auteur du modèle), ne va pas vraiment à l'encontre de la tendance. – ArjunShankar

+0

Ma question serait pourquoi mettre des méthodes statiques dans une classe singleton qui ne nécessitent pas une instance de l'objet? Peut-être invalider est trop fort d'un mot, comme le modèle peut être mis en œuvre dans d'autres méthodes. Cependant, je suis curieux de savoir pourquoi on voudrait les deux dans le même objet. En plus de nuire à la testabilité, cela ne provoquerait-il pas un mélange hétérogène de fonctionnalités objet? Je crois comprendre que le point d'un singleton est de fournir des méthodes qui nécessitent un pool de ressources partagé instancié une fois. Si une méthode ne l'exige pas, est-ce qu'elle appartient vraiment à cet objet? – JoshC13

9

Eh bien, techniquement, singletonobj.getinstance() est redondant, car cela signifie que vous déjà a pris possession de l'objet.

L'appel regarderait quelque chose comme:

SingletonClass::getinstance().dosomething(); 

ou

singletonobj.dosomething() 

au cas où vous récupéré au préalable l'objet - par exemple, auparavant, ne

SingletonClass& singletonobj = SingletonClass::getinstance();