51 votes

Monostate vs Singleton

Quels sont les scénarios quand on utilise une Monostate motif au lieu de singleton afin de maintenir un objet global?

Edit: Je sais ce que Singleton et Monostate modèles sont. Ont également mis en œuvre Singleton dans un certain nombre de scénarios. Je veux juste savoir les scénarios (des exemples de cas) où MonoState modèle doit être mis en œuvre.

Pour eg. J'ai besoin de maintenir la liste de colonnes par écran dans mon application windows forms. Je pourrais utiliser un Singleton Dictionnaire dans ce cas. Cependant, je suis de stocker une Liste statique global var et je voulais fournir des indexeurs (car j'ai besoin d'ajouter dynamiquement une nouvelle entrée à la liste si la clé n'est pas présente) où je pourrais spécifier ScreenDetails.Pseudo en tant que clé et obtenir le ScreenDetails.ColumnsTable. Depuis les indexeurs ne peut pas fonctionner sur une classe statique, j'ai changé le modèle de Monostate.

Je voudrais donc savoir ce que les autres scénarios peuvent obliger un utilisateur à utiliser Monostate au lieu de Singletons.

68voto

dfa Points 54490

monostate et singleton sont deux faces de la même médaille (état global):

  • monostate force un comportement (une seule valeur parmi toutes les instances de classe)
  • singleton force une contrainte structurelle (une seule instance)

l'utilisation de singleton n'est pas transparente

c'est à dire:

 Singleton singleton = Singleton.getInstance();
 

l'utilisation du monostate est transparente

c'est à dire:

 MonoState m1 = new MonoState();
MonoState m2 = new MonoState(); // same state of m1
 

43voto

egaga Points 5367

Voici ce que Robert C. Martin a à dire à ce sujet: Singleton vs Monostate (pdf)

SINGLETON est mieux utilisé lorsque vous avez une classe existante que vous souhaitez limiter par dérivation, et ne vous dérange pas que tout le monde aura à l'appel de l'instance() méthode pour gagner l'accès. Monostate est préférable de l'utiliser lorsque vous voulez que la nature singulière de la classe pour être transparent pour les utilisateurs, ou lorsque vous souhaitez employer polymorphes dérivés de l'objet unique.

21voto

David Moles Points 7669

À sa base Monostate est juste sucre syntaxique autour de Singleton. Où Monostate devient intéressant, c'est quand vous commencez à sous-classement, parce que les sous-classes peuvent décorer l'état partagé avec des comportements différents.

Un simple -- si un peu artificiel et pas très efficace :) -- exemple:

public class GlobalTable implements Iterable<Key> {

  /** Shared state -- private */    
  private static final Map<Key, Value> MAP = new LinkedHashMap<Key, Value>();

  /** Public final accessor */    
  public final Value get(Key key) {
    return MAP.get(key);
  }

  /** Public final accessor */    
  public final boolean put(Key key, Value value) {
    return MAP.put(key);
  }

  /** Protected final accessor -- subclasses can use this to access
      the internal shared state */    
  protected final Set<Key> keySet() {
    return MAP.keySet();
  }

  /** Virtual -- subclasses can override for different behavior */    
  public Iterator<Key> iterator() {
    return Collections.unmodifiableSet(MAP.keySet()).iterator();
  }
}

Maintenant, si nous voulons un accès indexé?

public class IndexedGlobalTable extends GlobalTable {

  public List<Key> getKeysAsList() {
    return Collections.unmodifiableList(new ArrayList<Key>(keySet()));
  }

  public Key getKeyAt(int index) {
    return getKeysAsList().get(index);
  }

  public Value getValueAt(int index) {
    return get(getKeyAt(index));
  }
}

Que diriez-triés clés?

public class SortedGlobalTable extends GlobalTable {

  @Override
  public Iterator <Key> iterator() {
    return Collections
      .unmodifiableSortedSet(new TreeSet<Key>(keySet())).iterator();
  }

}

Tout moment vous avez besoin de l'un ou l'autre point de vue des données, que vous venez de créer une instance de la sous-classe appropriée.

Bien sûr, si les données globales est vraiment une bonne idée, en premier lieu, c'est une autre question, mais au moins Monostate vous donne plus de flexibilité dans la façon dont vous l'utilisez.

10voto

Ed Sykes Points 409

Quelqu'un doit noter que les singletons et monostate sont extrememly dangereux motifs. Ils ont tendance à mauvais escient par des paresseux codeurs qui ne veulent pas avoir à penser à la vie de l'objet qu'ils veulent faire dans un singleton. Ils font des tests de plus en plus difficile et créer rigides systèmes qui sont étroitement liés.

Il est extrêmement rare de trouver une situation où un singleton ou monostate est véritablement nécessaire. La méthode préférée de l'objet de la collaboration est d'Injection de Dépendance.

Beaucoup a été écrit sur ce sujet:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X