Sto leggendo il libro dei modelli di design di Gang of 4. Un singleton usa l'incapsulamento? A me sembrerebbe sì, ma non ne sono sicuro al 100%. Forse non ho una buona conoscenza dell'incapsulamento.
Sto leggendo il libro dei modelli di design di Gang of 4. Un singleton usa l'incapsulamento? A me sembrerebbe sì, ma non ne sono sicuro al 100%. Forse non ho una buona conoscenza dell'incapsulamento.
Non sono a conoscenza di una definizione canonica concordata di "incapsulamento" ma credo che possiamo richiedere almeno quanto segue.
An object's internals are encapsulated if it is not possible to transform the object into an invalid state (where its invariants are broken) via its public interface.
L'interfaccia pubblica della classe singleton consiste in una singola funzione statica getInstance
più qualsiasi interfaccia che l'oggetto singleton fornisce effettivamente (non fa parte del modello). La funzione getInstance
chiaramente non può essere utilizzata per portare qualcosa in uno stato non valido perché tutto ciò che fa è creare un'istanza tramite il costruttore predefinito e memorizzarla nella cache in una variabile globale. L'effettiva (utile) interfaccia della classe obbedisce all'incapsulamento spetta al suo implementatore. (Poiché il costruttore predefinito è privato, in linea di principio dovrebbe essere consentito costruire un oggetto in uno stato non valido, ma supponiamo che non lo sia.)
Considerando l'incapsulamento del resto della classe, il modello singleton non cambia nulla al riguardo. Oppure, come Robert Harvey lo ha inserito nei commenti:
A Singleton doesn't bring any encapsulation to the table that a class doesn't already have. If a class has poor encapsulation, it will still have poor encapsulation after it is turned into a Singleton. A Singleton restricts a class to a single instance, and that's all that it does.
D'altra parte, se la tua classe è stata correttamente incapsulata in primo luogo, renderla un singleton non distruggerà quella proprietà. Il modello singleton viola però un altro importante principio. Il principio di responsabilità singola . In pratica dice che ogni componente dovrebbe fare un lavoro e farlo bene. (Vedi i commenti sottostanti per un parere un po 'diverso.) Il modello singleton accosta la logica del business che la classe esegue insieme alle regole che possono crearne un'istanza e quante. Ciò porta ad un accoppiamento più stretto tra esso ei suoi consumatori che non desiderabile e rende particolarmente difficile testare in modo approfondito. Oggi il singleton è considerato da molti un antipattern. Molto è stato detto a riguardo, quindi ecco un solo video di Pulisci conversazioni di codice di Google sull'argomento: "Global state and Singletons" di Miško Hevery .
Leggi altre domande sui tag encapsulation design-patterns singleton