design-patterns - usare - singleton significato




Differenza tra classe statica e modello singleton? (20)

  1. Caricamento pigro
  2. Supporto di interfacce, in modo che possa essere fornita un'implementazione separata
  3. Possibilità di restituire il tipo derivato (come combinazione di lazyloading e implementazione dell'interfaccia)

Che differenza reale (cioè pratica) esiste tra una classe statica e uno schema singleton?

Entrambi possono essere richiamati senza istanziazione, entrambi forniscono solo una "Istanza" e nessuno dei due è thread-safe. C'è qualche altra differenza?


  1. Gli oggetti Singleton sono memorizzati in Heap , ma gli oggetti statici sono memorizzati nello stack .
  2. Possiamo clonare (se il progettista non lo ha disabilitato) l'oggetto singleton, ma non possiamo clonare l'oggetto statico di classe.
  3. Le classi Singleton seguono l' OOP (principi orientati agli oggetti), le classi statiche no.
  4. Possiamo implementare interface con una classe Singleton, ma i metodi statici di una classe (o ad es. Una static class C #) non possono.

Abbiamo il nostro framework DB che effettua connessioni al back-end. Per evitare letture sporche su più utenti, abbiamo usato il modello singleton per garantire che abbiamo istanze singole disponibili in qualsiasi momento.

In c # una classe statica non può implementare un'interfaccia. Quando una classe di istanza singola deve implementare un'interfaccia per un contratto aziendale o per scopi IoC, è qui che utilizzo il pattern Singleton senza una classe statica

Singleton fornisce un modo per mantenere lo stato in scenari senza stato

Spero che ti aiuti ..


Beh, un singleton è solo una classe normale che IS ha istanziato, ma solo una volta e indirettamente dal codice client. La classe statica non viene istanziata. Per quanto ne so i metodi statici (la classe statica deve avere metodi statici) sono più veloci di quelli non statici.

Modificare:
Descrizione della regola FxCop Performance: "I metodi che non accedono ai dati dell'istanza o dei metodi dell'istanza di chiamata possono essere contrassegnati come statici (Condivisi in VB). Dopo averlo fatto, il compilatore emetterà i siti di chiamata non virtuali a questi membri che impediranno un controllo a runtime per ogni chiamata che assicura che il puntatore all'oggetto corrente sia non nullo. Ciò può comportare un guadagno di prestazioni misurabile per il codice sensibile alle prestazioni.In alcuni casi, l'impossibilità di accedere all'istanza dell'oggetto corrente rappresenta un problema di correttezza. "
In realtà non so se questo si applica anche ai metodi statici nelle classi statiche.


Dal punto di vista del cliente, il comportamento statico è noto al client, ma il comportamento di Singleton può essere completato nascosto da un client. Il cliente potrebbe non sapere mai che esiste una sola istanza con cui sta giocando ancora e ancora.


Ecco un buon articolo: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

Lezioni statiche

  • una classe con tutti i metodi statici .
  • prestazioni migliori (i metodi statici sono legati al tempo di compilazione)
  • non può sovrascrivere i metodi, ma può utilizzare il metodo nascosto. ( Qual è il metodo nascosto in Java? Anche la spiegazione di JavaDoc è confusa )

    public class Animal {
        public static void foo() {
            System.out.println("Animal");
        }
    }
    
    public class Cat extends Animal {
        public static void foo() {  // hides Animal.foo()
            System.out.println("Cat");
        }
    }
    

Singleton

In sintesi, userei solo le classi statiche per tenere metodi util e usare Singleton per tutto il resto.

Le modifiche


In un articolo che ho scritto ho descritto il mio punto di vista sul perché il singleton sia molto meglio di una classe statica:

  1. La classe statica non è in realtà una classe canonica: è uno spazio dei nomi con funzioni e variabili
  2. Utilizzare la classe statica non è una buona pratica a causa della rottura dei principi di programmazione orientata agli oggetti
  3. La classe statica non può essere passata come parametro per gli altri
  4. La classe statica non è adatta per l'inizializzazione "pigro"
  5. L'inizializzazione e l'uso della classe statica sono sempre difficili da rintracciare
  6. Implementare la gestione dei thread è difficile

La vera risposta è di Jon Skeet, su un altro forum qui .

Un singleton consente l'accesso a una singola istanza creata: quell'istanza (o piuttosto un riferimento a tale istanza) può essere passata come parametro ad altri metodi e trattata come un oggetto normale.

Una classe statica consente solo metodi statici.


Leggo quanto segue e penso che abbia senso anche:

Prendersi cura degli affari

Ricorda, una delle regole OO più importanti è che un oggetto è responsabile di se stesso. Ciò significa che i problemi relativi al ciclo di vita di una classe devono essere gestiti nella classe, non delegati a costrutti del linguaggio come statici e così via.

dal libro Obiettivo orientato al pensiero Processo 4a Ed.


Lo schema Singleton presenta numerosi vantaggi rispetto alle classi statiche. Innanzitutto, un singleton può estendere le classi e implementare le interfacce, mentre una classe statica non può (può estendere le classi, ma non eredita i membri dell'istanza). Un singleton può essere inizializzato pigramente o in modo asincrono mentre una classe statica viene generalmente inizializzata quando viene caricata per la prima volta, causando potenziali problemi con il programma di caricamento classi. Tuttavia, il vantaggio più importante, tuttavia, è che i singleton possono essere gestiti in modo polimorfico senza costringere i propri utenti a supporre che esista un'unica istanza.


Non sono un grande teorico OO, ma da quello che so, penso che l'unica caratteristica OO che le classi statiche mancano rispetto a Singletons è il polimorfismo. Ma se non ne hai bisogno, con una classe statica puoi ovviamente avere ereditarietà (non sono sicuro riguardo l'implementazione dell'interfaccia) e l'incapsulamento di dati e funzioni.

Il commento di Morendil, "Lo stile del design incarnato in una classe statica è puramente procedurale" Potrei sbagliarmi, ma non sono d'accordo. Nei metodi statici è possibile accedere ai membri statici, che sarebbero esattamente gli stessi dei metodi Singleton che accedono ai membri delle singole istanze.

modificare:
In realtà sto pensando ora che un'altra differenza è che una classe statica viene istanziata all'avvio del programma * e vive per tutta la durata del programma, mentre un singleton è esplicitamente istanziato in un dato momento e può anche essere distrutto.

* oppure può essere istanziato al primo utilizzo, a seconda della lingua, penso.


Per espandere la risposta di Jon Skeet

La grande differenza tra un singleton e un mucchio di metodi statici è che i singleton possono implementare interfacce (o derivare da utili classi di base, sebbene questo sia l'IME meno comune), in modo da poter aggirare il singleton come se fosse "solo un'altra implementazione".

I single sono più facili da usare quando l'unità testa una classe. Ovunque passi un singleton come parametro (costruttori, setter o metodi) puoi invece sostituire una versione derisoria o stubata del singleton.


Quando voglio una lezione con piena funzionalità, ad es. Ci sono molti metodi e variabili, io uso singleton;

Se voglio una classe con solo uno o due metodi, ad esempio la classe MailService, che ha solo 1 metodo SendMail (), io uso la classe e il metodo statici.


Singleton è istanziato, è solo che c'è una sola istanza mai istanziata, da cui il singolo in Singleton.

Una classe statica non può essere istanziata da qualcosa di diverso da se stessa.


Sono d'accordo con questa definizione:

La parola " singolo " indica un singolo oggetto nel ciclo di vita dell'applicazione, quindi l'ambito è a livello di applicazione.

Lo statico non ha alcun puntatore all'oggetto, quindi l'ambito è a livello di dominio dell'app.

Inoltre entrambi dovrebbero essere implementati per essere thread-safe.

È possibile trovare interessanti altre differenze su: Singleton Pattern Versus Static Class


Un altro vantaggio di un singleton è che può essere facilmente serializzato, che può essere necessario se è necessario salvare il suo stato su disco o inviarlo da qualche parte in remoto.


Una differenza notevole è l'istanza differenziata che viene fornito con Singletons.

Con le classi statiche, viene creato dal CLR e non abbiamo il controllo su di esso. con i singleton, l'oggetto viene istanziato alla prima istanza a cui si cerca di accedere.


un. Serializzazione: i membri statici appartengono alla classe e quindi non possono essere serializzati.

b. Sebbene abbiamo reso il costruttore privato, le variabili membro statiche verranno comunque trasferite in sottoclasse.

c. Non possiamo eseguire l'inizializzazione pigra poiché tutto verrà caricato solo durante il caricamento della classe.


Classe statica: -

  1. Non è possibile creare l'istanza della classe statica.

  2. Caricato automaticamente da .NET Framework Common Language Runtime (CLR) quando viene caricato il programma o lo spazio dei nomi contenente la classe.

  3. La classe statica non può avere un costruttore.

  4. Non possiamo passare la classe statica al metodo.

  5. Non possiamo ereditare la classe statica in un'altra classe statica in C #.

  6. Una classe con tutti i metodi statici.

  7. Prestazioni migliori (i metodi statici sono legati al tempo di compilazione)

Singleton:-

  1. È possibile creare un'istanza dell'oggetto e riutilizzarla.

  2. L'istanza Singleton viene creata per la prima volta quando l'utente lo richiede.

  3. La classe Singleton può avere un costruttore.

  4. È possibile creare l'oggetto della classe Singleton e passarlo al metodo.

  5. La classe di Singleton non dice alcuna restrizione dell'eredità.

  6. Possiamo disporre gli oggetti di una classe singleton ma non di una classe statica.

  7. I metodi possono essere ignorati.

  8. Può essere pigro caricato quando necessario (le classi statiche sono sempre caricate).

  9. Possiamo implementare l'interfaccia (la classe statica non può implementare l'interfaccia).


Comprendendo la differenza tra una classe statica e una classe non statica di Singleton, la statica è semplicemente un "tipo" non istanziato in C #, dove Singleton è un vero "oggetto". In altre parole, tutti i membri statici di una classe statica sono assegnati al tipo ma nel Singleton sono alloggiati sotto l'oggetto. Ma tieni presente che una classe statica si comporta ancora come un tipo di riferimento non essendo un tipo di valore come una Struct.

Ciò significa che quando si crea un Singleton, poiché la classe stessa non è statica, ma il suo membro è, il vantaggio è che il membro statico all'interno del Singleton che si riferisce a se stesso è collegato a un "oggetto" reale anziché a un "tipo" vuoto di se stesso. Questo tipo di chiarimenti ora fa la differenza tra uno statico e un non statico Singleton al di là delle sue altre caratteristiche e dell'uso della memoria, il che è fonte di confusione per me.

Entrambi utilizzano membri statici che sono copie singole di un membro, ma Singleton racchiude il membro di riferimento attorno a un "oggetto" istanziato vero, il cui indirizzo esiste oltre al suo membro statico. L'oggetto stesso ha proprietà in cui può essere passato intorno e referenziato, aggiungendo valore. La classe statica è solo un tipo quindi non esiste se non per indicare i suoi membri statici. Questo concetto ha cementato lo scopo della Singleton vs Static Class oltre l'ereditarietà e altre questioni.







singleton