2012-12-31 27 views
9

Nonostante i molti thread su questo argomento, non sono ancora chiaro quando scegliere quale approccio. Spero che discutendo un esempio specifico, alla fine lo "capisco".Classe Singleton contro classe con membro statico

Nota: il mio linguaggio qui è Cocoa sebbene il problema generale non sia specifico della lingua.

Ho un TaskQueue service classe che voglio usare per:

  • l'accesso da qualsiasi luogo nel mio codice al fine di aggiungere o rimuovere operazioni pianificate
  • elaborare automaticamente le operazioni pianificate a intervalli regolari

Quando TaskQueue viene utilizzato per la prima volta, desidero che TaskQueue avvii un thread che si riavvierà a intervalli regolari per elaborare le attività.

Ovviamente, ho bisogno almeno due variabili:

  • un array per memorizzare i compiti
  • un'istanza del filo elaborazione delle operazioni

Poiché desidero sola coda di attività e un thread per elaborare queste attività, ho due scelte:

  1. Fare TaskQueue service una classe Singleton (usando per esempio CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR come descritto in http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html, che credo che dovrò modificare il file CWLSynthesizeSingleton.h per avviare la discussione in fase di init.)

  2. Avere la gamma di compiti e il filo esempio sia essere statico (seguendo l'approccio suggerito qui: How do I declare class-level properties in Objective-C?)

c'è chiaramente un approccio che è meglio che l'altro in questo caso specifico? Se è così, perché?

+0

duped: http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?lq=1 – cregox

risposta

29

Le principali differenze sono cose semplici come:

  • con un Singleton è possibile passare intorno all'oggetto per i delegati e le richiamate
  • con un Singleton è possibile implementare interfacce e derivarlo
  • con un Singleton puoi usare un modello di fabbrica per creare la tua istanza

Se non ne hai bisogno, come con la funzionalità globale a cui devi accedere tutto intorno il tuo codice allora puoi andare con metodi statici.

Personalmente preferisco usare metodi statici a meno che non abbia una ragione esplicita per usare un'istanza singleton (come avere un'interfaccia comune ma diverse implementazioni).

Attenzione al fatto che il refactoring di metodi statici su un'istanza di singleton è un processo abbastanza semplice, quindi se dovessi trovare la necessità di quest'ultimo lo rifatterai facilmente (allora hai il preprocessore C, un solo #define sarebbe abbastanza).

+0

Chiaro e conciso. Grazie. – Lolo

+2

Una domanda però: puoi fornire un esempio di scenario in cui il passaggio attorno all'oggetto per delegati e callback sarebbe utile/richiesto rispetto al semplice utilizzo di metodi statici e non dovendo aggirare alcun oggetto? – Lolo

+2

Qualsiasi delegato di cacao standard impostato da 'object.delegate = instance' richiede un'istanza reale di un oggetto. Una classe con metodi statici non può essere utilizzata in tale scenario per adempiere al ruolo di un delegato. Se un meccanismo di callback/delegato è implementato da te allora puoi sempre evitare la necessità di istanze reali. – Jack

Problemi correlati