Perché non usiamo una classe e i suoi membri statici per fare ciò che fa un singleton?

5

In Java, C ++, Objective C, C # e tutti gli altri linguaggi OOP simili,

Perché non usiamo una classe con metodi statici e vars invece di passare attraverso una sintassi singleton che deve gestire vari scenari?

    
posta Amogh Talpallikar 07.02.2013 - 06:15
fonte

3 risposte

7

Questa domanda ha già una risposta qui

The big difference between a singleton and a bunch of static methods is that singletons can implement interfaces (or derive from useful base classes, although that's less common IME), so you can pass around the singleton as if it were "just another" implementation.

    
risposta data 07.02.2013 - 06:55
fonte
4

Prima di tutto, lasciami dire che non sono un fan di nessuna di queste idee - le variabili globali creano una sfaccettatura di problemi indipendentemente dal fatto che siano disponibili in un modello di packaging o meno.

Detto questo, un singleton è (generalmente) l'istanza esterna basata con l'eccezione del suo metodo statico Instance (), il che significa che è possibile partecipare in qualche misura al polimorfismo di runtime. In altre parole, un singleton può implementare un'interfaccia, ereditare da qualche altra classe, o ereditarne un'altra (io non consiglio seriamente quest'ultima). I metodi statici sono di natura interamente procedurale, quindi non è possibile eseguire alcuna di queste azioni orientate agli oggetti con essi.

Il vantaggio principale di Singleton, per quanto mi riguarda, è che è un po 'più semplice pensare a un design migliore se stai iniziando con un singleton che se stai iniziando con classi statiche pure che sono di casa. Con quest'ultimo approccio, l'architettura dell'applicazione è flessibile quanto un diamante e con i singleton, è flessibile come, per dire, l'acciaio. Il singleton è leggermente meno cattivo, dal punto di vista della flessibilità, e anche leggermente più facile da risolvere.

Esiste un altro modello, denominato monostate , in cui tutte le istanze condividono lo stato statico interno ma espongono solo i metodi di istanza. Se devi solo avere le tue variabili globali, questo è un buon modo per impedire loro di creare dipendenze nascoste tra le tue classi che tendono a rendere singleton e classi statiche con stato tale mal di testa di manutenzione.

    
risposta data 07.02.2013 - 07:34
fonte
4

Per me la grande differenza è che un singleton è molto più flessibile.

Posso usare il metodo getInstance() come fabbrica. Quindi se voglio posso cambiare la classe per restituire una nuova istanza ogni volta invece che una singola istanza per tutto il tempo se scopro che è necessaria dalla mia applicazione.

Se voglio farlo con una classe che ha solo metodi statici, devo rifattorizzare l'intera applicazione.

Anche il metodo getInstance() può restituire un'altra implementazione (una sottoclasse del singleton) così posso cambiare l'implementazione senza cambiare la mia applicazione.

BTW Uso anche a volte le classi con metodi statici se sono sicuro di non aver bisogno delle funzionalità di cui sopra.

    
risposta data 07.02.2013 - 08:21
fonte

Leggi altre domande sui tag