2010-11-03 6 views

Répondre

13

J'ai trouvé ceci ici sur le site IBM. Il explique assez bien l'utilisation d'une classe Logger Singleton.

Un exemple classique d'un véritable singleton est un service de l'exploitation forestière. Supposons que nous ayons un service de consignation basé sur un événement: Les objets Client demandent que le texte soit consigné par en envoyant un message au service de consignation . D'autres objets enregistrent en fait le texte quelque part (console, fichier, ) en écoutant le service de consignation pour ces demandes de consignation et en les manipulant. Tout d'abord, notez que le service de journalisation passe le test classique pour être un singleton:

  • Plaignants ont besoin d'un objet bien connu auquel envoyer des demandes de journal. Cela signifie un point global d'accès .
  • Étant donné que le service de journalisation est une source d'événement unique à laquelle plusieurs écouteurs peuvent s'inscrire, seul doit être une instance.

Voici le lien: Use your singletons wisely

Si vous utilisez pas une classe singleton que vous auriez à faire face à la synchronisation (écrire dans un fichier, ou tout flux que vous utilisez) entre ces différents enregistreur instances. Donc, c'est beaucoup plus facile, quand vous avez juste une instance globale de Logger.

0

Dépend de la structure de journalisation. Habituellement, vous voulez que tous les messages se retrouvent dans un seul journal, vous voulez donc que tout le code utilise le même enregistreur. Mais la classe logger n'a pas besoin d'être un singleton pour s'en assurer.

2

Le problème principal est celui où le journal actuel est conservé.

Si vous écrivez sur un système de fichiers, le fait d'avoir plusieurs instances (et donc, probablement, plus d'un thread) peut entraîner un fichier tronqué. Dans le sens où, en fonction de la mise en mémoire tampon et d'autres mécanismes de bas niveau, les messages d'une écriture peuvent être mélangés avec des messages (ou des parties de messages) provenant d'autres personnes.

Cela peut être un problème mineur, mais c'est le seul que je peux penser à propos d'avoir un seul objet d'écriture de journal (et donc en série).

2

Si vous avez plusieurs flux de journal avec un contenu différent, vous pouvez utiliser plusieurs instances de la classe de consignateur initialisée pour les différentes sorties. Toutefois, si vous avez un seul flux de journal, la présence de plusieurs instances de classe Logger entraîne une implémentation plus complexe, car les instances doivent travailler ensemble pour gérer la ressource réelle. Considérons par exemple un enregistreur qui enregistre chaque message avec un numéro de séquence. Deux instances devront synchroniser leurs compteurs de séquence, ce qui leur demande de se connaître, de négocier des augmentations de compteur, etc.(L'alternative d'avoir un compteur partagé dans un membre de classe statique équivaut à avoir un enregistreur singleton)

Questions connexes