2010-11-03 17 views

risposta

13

L'ho trovato qui sul sito IBM. Spiega piuttosto bene l'uso di una classe di Logger Singleton.

Un classico esempio di un vero e proprio Singleton è un servizio di registrazione. Supponiamo di avere un servizio di registrazione basato sugli eventi: gli oggetti client richiedono che il testo venga registrato da inviando un messaggio al servizio di registrazione . Altri oggetti in realtà registrano il testo da qualche parte (console, file, qualunque) ascoltando il servizio di registrazione per queste richieste di registrazione e gestendoli. In primo luogo, si noti che il servizio di registrazione passa il classico di test per essere un Singleton:

  • I richiedenti hanno bisogno di un oggetto ben noto a cui inviare le richieste a registro. Questo significa un punto globale di accesso .
  • Poiché il servizio di registrazione è una singola origine evento a cui possono essere registrati più ascoltatori , solo deve essere un'istanza.

Qui il link: Use your singletons wisely

Se non si desidera utilizzare una classe Singleton si dovrebbe avere a che fare con la sincronizzazione (scrittura in un file, o qualsiasi flusso si utilizza) tra questi diversi logger le istanze. Quindi è molto più semplice quando hai solo un'istanza di Logger globale.

0

Dipende dal framework di registrazione. Solitamente si desidera che tutti i messaggi vadano a un registro, quindi si desidera che tutto il codice utilizzi lo stesso programma di registrazione. Ma la classe dei taglialegna non deve essere un singleton per garantirlo.

2

Il problema principale riguarda la permanenza del registro effettivo.

Se si sta scrivendo su un filesystem, avere più di un'istanza (e quindi, probabilmente, più di un thread) potrebbe risultare in un file confuso.

Nel senso che, a seconda del buffering e di altri meccanismi di basso livello, i messaggi di una scrittura possono essere mescolati con messaggi (o parti di messaggi) da altri.

Questo può essere un problema minore, ma è l'unico che posso pensare di avere un solo oggetto di scrittura log (e quindi seriale).

2

Se si dispone di più flussi di log con contenuto diverso, è possibile utilizzare più istanze della classe del registratore inizializzata per i diversi output.

Tuttavia, se si dispone di un solo flusso di log, disporre di più istanze di classe del logger porta a un'implementazione più complessa, poiché le istanze devono collaborare per gestire la risorsa effettiva. Si consideri ad esempio un logger che registra ciascun messaggio con un numero di sequenza. Due istanze dovranno sincronizzare i loro contatori di sequenza, il che richiede loro di conoscersi l'un l'altro, negoziare aumenti del contatore e così via.(L'alternativa di avere un contatore condiviso in un membro di classe statico equivale ad avere un logger di singleton)

Problemi correlati