risposta-alla-domanda-sullo-sviluppo-web-bd.com

Perché Singleton è considerato un anti-pattern?

Possibile duplicato:
Cosa c'è di male nei Singletons?

Singleton Design Pattern: Pitfalls

Singleton anti-pattern

Ho sentito di recente che Singleton è un anti-schema. So che ha a che fare con il fatto che creare una singleton di classe è come rendere quell'istanza univoca una variabile globale, ma sta anche facendo molto di più (limitare il numero di istanze di quell'oggetto, gestire l'istanza, ecc.).

Perché esattamente Singleton è considerato un anti-pattern? E quali sono le alternative?

69
user1710031

Per aiutare a rispondere, ecco di più sul commento anti-pattern:

è abusato, introduce restrizioni non necessarie in situazioni in cui non è richiesta una sola istanza di una classe e introduce lo stato globale in un'applicazione

Da: http://en.wikipedia.org/wiki/Singleton_pattern

Per ulteriori informazioni, puoi consultare: https://www.michaelsafyan.com/tech/design/patterns/singleton

Ecco un ottimo finale per il blog sopra:

In breve, il modello singleton rende il codice più complesso, meno utile e un vero dolore da riutilizzare o testare. Eliminare i singoli può essere complicato, ma è uno sforzo utile.

OK, quindi, il motivo per cui è un anti-pattern è descritto bene in questo paragrafo e, come l'autore esprime, abbina strettamente il tuo codice al singleton.

Se scopri di voler usare un singleton, potresti prendere in considerazione il tuo design, ma ci sono volte in cui è utile.

Ad esempio, una volta ho dovuto scrivere un'applicazione che potesse avere al massimo una connessione al database, per elaborare migliaia di richieste. Quindi, un singleton ha un senso dal momento che sono una risorsa limitata ad avere solo un'istanza.

Ma, generalmente, questo viene utilizzato per semplificare il codice, senza pensare alle difficoltà che verranno introdotte.

Ad esempio, e questo vale anche per le classi statiche, se si esegue il test unitario o si dispone di concorrenza, lo stato di una richiesta cambierà lo stato e ciò potrebbe causare problemi, poiché la classe che chiama l'istanza può assumere che lo stato sia come previsto.

Penso che il modo migliore per sfidare l'uso sia quello di pensare a come gestirlo se il tuo programma è multi-thread, e un modo semplice per farlo è quello di testarlo, se hai diversi test eseguiti contemporaneamente.

Se trovi che ne hai ancora bisogno, allora usalo, ma renditi conto dei problemi che si incontreranno in seguito.

63
James Black

Non considero esattamente singleton un anti-pattern.

Tuttavia, singleton è fondamentalmente un modo per utilizzare le variabili globali. E le variabili globali sono sbagliate perché qualsiasi codice in qualsiasi parte del sistema può cambiare i loro valori. Quindi, durante il debug, può essere difficile capire quale percorso di codice porta allo stato corrente del singleton.

19
Jack Edmonds

Penso che sia considerato un anti-pattern perché una classe Singleton non può essere istanziata in modo normale da altri oggetti (tranne chiamando questo metodo comunemente chiamato "getInstance"). Quindi, sembrerà che la classe venga utilizzata direttamente senza istanziarla per creare prima un oggetto utilizzabile.

Concordo con te sul fatto che Singleton può fungere da istanza unica globale. Ho imparato da alcune persone che come alternative a Singleton, possiamo usare variabili statiche e/o finali e possiamo anche usare l'enumerazione (in modo da poter raggruppare più variabili sotto un nome di gruppo come quello che facciamo di solito quando lavoriamo usando un classe/oggetto normali).

Tuttavia, queste alternative possono solo corrispondere alla capacità di una classe Singleton nella memorizzazione di stati/valori. Se abbiamo bisogno di funzioni uniche con cui lavorare, quelle variabili/enumerazioni statiche/finali non possono essere d'aiuto. Secondo me, questo è il caso in cui dobbiamo usare una classe Singleton (quando abbiamo bisogno di alcune funzioni uniche per lavorare con stati/valori statici/finali).

Saluti... :))

10
peter.aryanto

I singleton sono spesso mal implementati. Vedi doppio controllo controllato.

In quale ambito un'istanza Singleton deve essere unica. Come ambienti multi-thread, clustering ecc.

I single possono essere difficili da testare.

La memoria allocata a un Singleton non può essere liberata.

Con l'uso eccessivo di singoli passi dalla programmazione orientata agli oggetti alla programmazione procedurale.

6
daniel