2009-04-06 18 views
12

Non è una classe con tutti i membri/metodi statici una sorta di modello di progettazione singleton? C'è qualche svantaggio in particolare di avere tali classi? Una spiegazione dettagliata aiuterebbe.classe statica e singleton

risposta

17

Questo tipo di classe è noto come monostate - è leggermente diverso da un singleton.

Perché utilizzare un monostato anziché un singoletto? Nel loro original paper sul modello, Campana & Crawford suggeriscono tre reasonns (parafrasate da me):

  • sintassi più naturale accesso
  • Singleton manca un nome
  • più facile di ereditare da

I devo ammettere, non trovo nessuno di questi particolarmente avvincente. D'altra parte, il monostato non è sicuramente lo peggiore di rispetto al singleton.

+0

Diversi sì, ma non raggiunge esattamente la stessa cosa? Non vedo come questo abbia vantaggi o svantaggi rispetto al singleton "tradizionale", almeno in C++. –

+0

Esiste la differenza che lo spazio non verrà assegnato per un singleton a meno che non venga utilizzato, ma in pratica un oggetto singleton che non viene mai utilizzato sembra un caso raro. Qualcuno ha un caso d'uso comune in cui ciò sarebbe importante? –

+0

Tendo anche a pensare che la caratteristica di costruzione pigra tipica dei singleton sia inutile nella maggior parte dei casi - quelli in cui abbiamo solo bisogno di una variabile globale. Tuttavia, nel caso di una libreria, potremmo aver bisogno di una costruzione al volo per semplificare il codice dell'utente (sviluppatore in effetti). –

15

Robert C. Martin ha scritto un numero article alcune volte in merito alle differenze tra il modello di stato mono e il modello singleton.

+1

In base all'articolo, le uniche differenze sostanziali che ho potuto vedere erano che in Java, la distruzione di una Monostata è garantita ma non può essere passata tra JVM - ci sono differenze rilevanti per C++? –

+0

È esattamente uguale a quello di altre variabili. Se è allocata dinamicamente, dovrebbe essere deallocata con un deallocator compatibile. Se è nella memoria statica (vedi GOTW/XC++, IIRC), sarà distrutto e la fine del programma, ma non c'è modo di implementare le dipendenze. –

+0

Per quanto riguarda l'aspetto delle dipendenze, i singleton di A.Alexandrescu loki (da MC++ D) e i singleton ACE consentono di specificare le dipendenze. A proposito, sono entrambi singleton non intrusivi. –

0

Per un singleton tutti i costruttori devono essere privati, in modo che sia possibile accedere solo tramite una funzione. Ma tu sei abbastanza vicino ad esso.

+1

errato errato errato. – Thomasz

+0

Se pensi davvero che dovresti leggere di nuovo sui singleton. Costruttori privati ​​e uno o più membri statici accessibili solo tramite una funzione membro pubblico è la definizione stessa di un singleton – DaClown

+1

Se questa risposta è talmente errata da meritare 5 downvotes, potresti lasciare un commento perché? Qualcosa come "sbagliato sbagliato sbagliato" non è utile e non sono ancora convinto di sbagliarmi. – DaClown

1

classe con tutti i membri statici/metodi una sorta di modello di progettazione Singleton

classe - non modello. Quando parliamo di classi possiamo dire il modello degli attrezzi.


Funzioni statiche: non sono funzioni membro, sono simili sulle funzioni globali. Forse non hai bisogno di alcuna lezione?

Citazione di wikipedia:

in ingegneria del software, il singleton modello è un modello di design che è utilizzato per limitare istanziazione di una classe ad un oggetto.

Con questa definizione l'implementazione non è Singleton implementazione - non si utilizza un'idea comune uno (o più in definizione estesa) un'istanza della classe.

Ma a volte (non sempre) l'utilizzo della classe con tutte le funzioni statiche e il modello singleton - non hanno differenze significative.

2

Considerare una famiglia di classi di registrazione. Implementano tutti "LogMessage (messaggio, file, numero_riga). Alcuni inviano messaggi a stderr, alcuni inviano email a un gruppo di sviluppatori, alcuni incrementano il conteggio del messaggio particolare in una tabella di frequenza dei messaggi, alcuni percorsi a/dev/null .In fase di esecuzione, il programma controlla il vettore di argomenti, il Registro di sistema o le variabili di ambiente per cui la tecnica di registrazione utilizza e crea un'istanza di Logging Singleton con un oggetto di una classe appropriata, eventualmente caricando una DLL fornita dall'utente finale. Questa funzionalità è difficile da duplicare con un Singleton statico puro.