Quando la Comunità ritiene che sia appropriato utilizzare un Singleton? [duplicare]

StackOverflow https://stackoverflow.com/questions/138124

  •  02-07-2019
  •  | 
  •  

Domanda

  

Possibile duplicato:
   Singleton: come dovrebbe essere usato

In seguito all'eccellente domanda precedente di Ewan Makepeace sul modello Singleton, ho pensato di porre "quando la Comunità ritiene che sia appropriato usare un Singleton?"

Lasciami offrire un esempio di critica:

Ho un " IconManager " singleton. Inizia leggendo un file delle proprietà che indica dove si trovano le mie icone sul disco, quindi legge tutte le icone e le memorizza nella cache per uso futuro.

Le icone possono essere utilizzate in tutta la mia interfaccia utente (schede, tabelle, frame ecc.) ... quindi accedervi tramite un metodo Singleton statico è molto conveniente. Voglio anche assicurarmi che le icone vengano lette una volta e una sola volta (se sarebbe molto lento leggerle dal disco ogni volta che ne avevo bisogno) La comunità crede che questo sia un uso appropriato di un Singleton? In caso contrario, in quale altro modo potrebbe essere stato implementato?

Quali altri usi validi di Singleton potrebbero esserci?

È stato utile?

Soluzione

Il tuo IconManager implementa il modello di fabbrica, crea icone. E probabilmente hai solo bisogno di una fabbrica per costruire icone. Quindi nessun problema per questo caso usare un IMHO singleton. Ho creato software con molte di queste fabbriche centralizzate e tutto ha funzionato bene.

Vedi anche questa discussione: Esempi più comuni di uso improprio della classe singleton

Altri suggerimenti

Un approccio alternativo sarebbe quello di creare un'istanza della classe che carica le icone e quindi si passa un riferimento a questa istanza a tutti i controlli che devono accedere alle risorse. In questo modo in futuro potresti avere più di un caricatore di icone e passarli in giro secondo necessità. Più flessibile per il futuro, ma con il rovescio della medaglia piuttosto grande di farti passare il riferimento a un milione di controlli.

Un buon uso del singleton è quando si accede a una risorsa che può avere solo una connessione attiva. Esistono molti dispositivi hardware che presentano questa limitazione.

Supponiamo che ti stia collegando a una telecamera CCTV che consente solo una connessione. Il modello Singleton creerebbe questa connessione al primo utilizzo e la terrebbe aperta. Ogni volta che ti serviva un'immagine dalla fotocamera, possibilmente da più fonti, puoi colpire Singleton sapendo che, a tutti gli altri problemi considerati, l'immagine sarà disponibile.

Se anche la fotocamera ha un tempo di connessione iniziale lento, tenere la connessione aperta in questo modo anziché aprire la connessione, scattare una foto e chiudere nuovamente la connessione potrebbe essere molto più efficiente.

In realtà non ho mai usato un singleton, ma non ho usato molto i modelli di progettazione. Penso che siano molto preziosi quando altri modelli li richiedono come i modelli Factory e Gateway. Tuttavia, non sono quasi mai buoni da soli.

Potresti prendere in considerazione il Monostate Pattern che ti dà tutti i vantaggi del singleton senza molti degli svantaggi. Questo ti consente anche di avere un oggetto ricco che ha uno stato che ha le proprietà globali che stai cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top