2012-03-26 14 views
5

Sto creando un logger per un'applicazione. Sto usando una libreria di logger di terze parti. In quale logger è implementato come singleton.Si sta estendendo una classe singleton errata?

Ho esteso quella classe di logger perché voglio aggiungere alcune altre funzioni statiche. In queste funzioni statiche uso internamente l'istanza (che è singola) di Logger (che ho ereditato).

Non creo istanza di MyLogger né ho implementato nuovamente il metodo getInstance() di super classe. Ma sto ancora ricevendo avvertimenti come destructor di MyLogger non può essere creato come distruttore di classe parent (Loggger) non accessibile.

Voglio sapere, Sto facendo qualcosa di sbagliato? Ereditare il singleton è sbagliato o dovrebbe essere evitato ??

risposta

4

Lasciando i meriti del pattern Singleton da parte (c'è una scuola di pensiero che lo descrive come un anti-modello) non dovrebbe essere necessario sottoclasse per aggiungere semplicemente statica funzionalità. Qui ci sono approcci specifici di una lingua che io preferirei sottoclasse un Singleton:

  • Utilizzare una funzione di free-standing racchiuso in un C++ namespace
  • Utilizzare una classe di estensione in C#
  • Utilizzare una classe di supporto in Java
  • Utilizzare una categoria in Objective-C
+0

Sto usando il linguaggio C++ sto pensando di creare una classe wrapper di soli metodi statici che non erediteranno dalla classe Logger di Singleton. Com'è?? E ti prego di approfondire il metodo che hai descritto sopra per C++. Grazie .. – EngineeredBrain

+0

@AnwarShaikh Funziona anche - questo è quello che farei in Java, perché le funzioni indipendenti non sono disponibili lì.Andrei su quella strada anche in C++, ma solo se avessi bisogno di condividere lo stato o altri dettagli di implementazione tra le funzioni che sto aggiungendo. – dasblinkenlight

+0

Grazie !! Proverò scrivendo su di esso un wrapper. – EngineeredBrain

0

Vorrei utilizzare un non singleton e delegare le chiamate al singleton dove necessario. Ogni volta che hai l'opportunità di sbarazzarti di un Singleton, provaci.

+0

Sì, certo i singleton devono essere evitati, ma risulta essere buono se usato per qualcosa come Logger. E se avessi bisogno di alcuni metodi aggiuntivi insieme a quelli in singleton dovrei ereditarlo o scrivere wrapper (di classe con solo metodi statici) su singleton che usa internamente il singleton. – EngineeredBrain

+0

Vai per un wrapper. Questo è ciò che intendevo per "delegare le chiamate". –

0

Sono d'accordo con Garret Hall, dovresti evitare Singleton's se possbile. Detto questo, non lo vedo come sbagliato per una ragione. La persona che ha implementato il Singleton ti consente di estenderlo. Se lo sviluppatore di api non desiderava che il Logger della classe Singleton fosse esteso, avrebbe reso privato il costruttore, ad esempio in C++, o qualunque metodo fosse appropriato per la lingua che si sta utilizzando.

0

Penso scrivendo un wrapper sulla classe non è la soluzione corretta, perché è necessario scrivere wrapper per ogni metodo è necessario da Singleton. E finisci per scrivere dozzine di funzioni.

Inoltre, si sta limitando l'utilizzo di tutte le funzioni disponibili in singleton.

NON UNA BUONA IDEA !!!

Problemi correlati