Latest web development tutorials

Motif Singleton

Singleton (Singleton Pattern) Java est l'un des modèle de conception simple. Ce type de modèles de conception appartiennent create schema, qui fournit la meilleure façon de créer des objets.

Ce modèle implique une seule classe qui est responsable de la création de vos propres objets, tout en veillant à ce que un seul objet est créé. Cette classe fournit un objet unique de leur visite, il est possible d'accéder directement, vous ne devez instancier un objet de cette classe.

Remarque:

  • 1, classe singleton peut avoir une seule instance.
  • 2, classe singleton doit créer leur propre instance unique.
  • 3, classe singleton doit fournir cet exemple pour tous les autres objets.

introduction

Intention: faire en sorte que seule une instance d'une classe, et de fournir un point d'accès global pour y accéder.

La principale solution: utiliser une classe mondiale souvent créé et détruit.

Quand l'utiliser: Quand vous voulez contrôler le nombre de cas où, pour économiser les ressources du système.

Comment résoudre: déterminer si le système a déjà ce seul cas, si elle retourne, si pas alors créé.

Le code clé: le constructeur est privé.

Exemples d'application: 1, une partie ne peuvent avoir un président.2, Windows est un multi-processus, multi-thread, dans le fonctionnement d'un fichier quand il inévitablement plusieurs processus ou threads simultanément un document du phénomène, le traitement de tous les fichiers doivent être effectués par une instance unique. 3, une partie du gestionnaire de l'équipement est souvent conçu comme un modèle unique cas, comme un ordinateur avec deux imprimantes à la sortie lorsque cela est nécessaire pour faire face à deux imprimantes ne peuvent pas imprimer le même fichier.

Avantages: 1, une seule instance en mémoire, ce qui réduit les frais généraux de mémoire, en particulier fréquents créer et détruire des cas (comme l' École de gestion Page d' accueil cache).2, pour éviter plusieurs occupants des ressources (telles que les opérations d'écriture de fichier).

Inconvénients: pas d' interface, pas hérité, et la responsabilité unique principe conflit, une classe ne devrait être préoccupé par la logique interne, et non pas à l'extérieur comme la façon d'instancier.

Scénarios d' utilisation:1, exigent la production d'un numéro de série unique. 2, compteurs WEB, pas chaque base de données à Riga une fois avec un seul cas pour rafraîchir en cache. 3, un objet créé par la nécessité d'une consommation excessive des ressources, telles que la connexion E / S à la base de données et ainsi de suite.

Remarque: méthode getInstance ()nécessite l'utilisation de la synchronisation Verrouillage synchronisé (Singleton.class) pour empêcher plusieurs threads dans l'instance de la cause est instancié plusieurs fois.

réalisation

Nous allons créer une classeSingleObject.classeSingleObjecta son propre constructeur privé et une instance statique.

classeSingleObjectfournit une méthode statique pour obtenir en dehors de son instance statique.SingletonPatternDemo,nos classes de démonstration à l' aide de classeSingleObjectpour obtenir l' objetSingleObject.

modèle Singleton diagramme UML

Etape 1

Créer une classe Singleton.

SingleObject.java

public class SingleObject {

   // Création d'un objet SingleObject instance SingleObject private static = new SingleObject ();

   // Faire constructeur privé, de sorte que la classe ne sera pas instancié SingleObject privé () {}

   // Obtenir l'unique objet de publics statique SingleObject getInstance () {
      retour par exemple;
   }

   showMessage public void () {
      System.out.println ( "Bonjour tout le monde!");
   }
}

Etape 2

Obtenez objet unique de la classe singleton.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   main (String [] args) {public static void

      // Constructor // illégale erreur de compilation: Constructor SingleObject () ne soit pas visible // objet SingleObject = new SingleObject ();

      // Obtenir le seul objet objet disponible SingleObject = SingleObject.getInstance ();

      // Message d'affichage object.showMessage ();
   }
}

Etape 3

Vérifiez la sortie.

Bonjour tout le monde!

Plusieurs mise en œuvre du modèle Singleton

Mettre en oeuvre singleton un certain nombre de manières, comme suit:

1, le style paresseux, thread-safe

Etes - initialisation Lazy:Oui

Sont multi-thread - safe:Non

Atteindre Difficulté: facile

Description: Cette méthode est la façon la plus simple pour réaliser cette mise en œuvre le plus gros problème est pas en charge le multi-threading.Parce qu'il n'y a pas de verrou synchronisé, de sorte que le sens strict, il est pas un singleton.
chargement Lazy de cette manière évidemment ne nécessite pas la sécurité des threads, le travail dans un environnement multi-thread ne fonctionne pas.

Lesexemples de code:

public class Singleton {  
    instance Singleton private static;  
    Singleton privé () {}  
  
    public static Singleton getInstance () {  
    si (par exemple == null) {  
        instance = new Singleton ();  
    }  
    retour par exemple;  
    }  
}  

La prochaine présentation de plusieurs implémentations supporte plusieurs threads, mais diffèrent dans la performance.

2, le style paresseux, thread-safe

Etes - initialisation Lazy:Oui

Sont multi-thread - safe:Oui

Atteindre Difficulté: facile

Description: de cette manière ont un bon chargement paresseux, peut bien fonctionner dans un multi-thread, cependant, est très faible efficacité, 99% des cas ne nécessite pas de synchronisation.
Avantage: Le premier appel a été initialisé, pour éviter la mémoire gaspillée.
Inconvénients: doit être verrouillé synchronisés pour assurer un seul cas, mais le verrou aura une incidence sur l'efficacité.
getInstance () la performance de l'application ne soit pas critique (qui utilisent moins fréquemment).

Lesexemples de code:

public class Singleton {  
    instance Singleton private static;  
    Singleton privé () {}  
    public static synchronisée Singleton getInstance () {  
    si (par exemple == null) {  
        instance = new Singleton ();  
    }  
    retour par exemple;  
    }  
} 

3, la formule de faim

Sont Initialisation Lazy: Non

Sont multi-thread - safe:Oui

Atteindre Difficulté: facile

Description: Il est plus fréquent, mais sujettes à des objets d'ordures.
Avantages: non verrouillé, l'efficacité est améliorée.
Inconvénients: chargeur de classe est initialisée, la mémoire est gaspillé.
Il est basé sur le mécanisme de classloder évite la synchronisation multithreading, cependant, par exemple quand il est instancié class loader, bien que la classe de cause à charger une variété de raisons, la plupart du modèle Singleton est d'appeler la méthode getInstance, mais il ne peut pas être déterminée il y a d'autres façons (ou d'autres méthodes statiques) conduit à chargement des classes, cette fois-ci n'a apparemment pas atteint par exemple l'initialisation effet de chargement paresseux.

Lesexemples de code:

public class Singleton {  
    instance privée de statique Singleton = new Singleton ();  
    Singleton privé () {}  
    public static Singleton getInstance () {  
    retour par exemple;  
    }  
}  

4, double-contrôle du verrouillage / double verrouillage de contrôle (DCL, qui est double verrouillage vérifié)

JDK version: JDK1.5 de

Etes - initialisation Lazy:Oui

Sont multi-thread - safe:Oui

Réaliser la difficulté: plus complexe

Description: Cette méthode utilise double mécanisme de verrouillage, de sécurité et, dans le cas de multi-threading pour maintenir des performances élevées.
getInstance () la performance des applications est essentielle.

Lesexemples de code:

public class Singleton {  
    volatile statique Singleton singleton privé;  
    Singleton privé () {}  
    public static Singleton getSingleton () {  
    if (singleton == null) {  
        synchronisé (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton ();  
        }  
        }  
    }  
    retour singleton;  
    }  
}  

5, type d'enregistrement / classes internes statiques

Etes - initialisation Lazy:Oui

Sont multi-thread - safe:Oui

Réaliser la difficulté: General

Description: Cette méthode peut atteindre le mode de verrouillage à double contrôle même effet, mais la mise en œuvre plus facile.Utilisez l'initialisation paresseuse de champ statique doit être utilisé de cette façon au lieu de deux vérifier le mode de verrouillage. Ceci ne concerne que le cas d'un champ statique, double-vérifier le mode de verrouillage peut être utilisé en cas de besoin délai pour initialiser les champs d'instance.
Cette approche prend également parti des mécanismes de classloder pour garantir qu'un seul thread instance initialisation, il est de 3 façons différentes est: tant que la troisième voie classe Singleton est chargé, l'instance est instancié (lazy loading pas atteint effet), mais cette approche est la classe Singleton est chargé, par exemple ne peut pas être initialisé. Parce que la classe SingletonHolder est pas utilisé activement, affiché seulement par l'appel de méthode getInstance, apparaît chargé classe SingletonHolder, qui est instancié instance. Imaginez, si vous instanciez exemple de ressources, de sorte qu'il voulait retarder le chargement, d'autre part, lorsque vous ne voulez pas instancier classe Singleton chargeur, car il ne peut pas garantir la classe Singleton peut également être actif dans d'autres domaines afin d'être chargée, cette fois à instancier instance manifestement inappropriée. Cette fois-ci, de cette façon par rapport aux trois premières sortes de façons, il est tout à fait raisonnable.

Lesexemples de code:

public class Singleton {  
    classe statique SingletonHolder privée {  
    private static finale Singleton INSTANCE = new Singleton ();  
    }  
    Singleton privé () {}  
    public static final Singleton getInstance () {  
    retour SingletonHolder.INSTANCE;  
    }  
}   

6, énumérer

JDK version: JDK1.5 de

Sont Initialisation Lazy: Non

Sont multi-thread - safe:Oui

Atteindre Difficulté: facile

Description: Cette mise en œuvre n'a pas encore été largement adoptée, mais cela est la meilleure façon de mettre en œuvre pattern singleton.Il est concis mécanisme de soutien sérialisation plus, automatique pour empêcher plusieurs instances de l'absolu.
Cette approche est efficace Java auteur Josh Bloch préconise une manière qui non seulement permet d'éviter des problèmes de synchronisation multi-threads, mais prend également en charge automatiquement le mécanisme de sérialisation pour empêcher désérialisation re-créer un nouvel objet, absolument empêcher l'instanciation multiple. Toutefois, étant donné que rejoint après jdk1.5 propriétés enum, écrire de cette manière ne peut pas aider mais se sentir étrange, dans la pratique, rarement utilisé.
Non par réflexion attaque pour appeler le constructeur privé.

Lesexemples de code:

public enum Singleton {  
    INSTANCE;  
    whateverMethod public void () {  
    }  
}  

Règle de base: Dans des circonstances normales, ne recommande pas l'utilisation du premier type et le second type manière paresseuse, il est recommandé d'utiliser la troisième façon dont un homme a faim.Seulement lorsque vous souhaitez mettre en œuvre l'effet de chargement paresseux est clair, nous allons utiliser les cinq premières sortes de façons d'enregistrer. Si elle vient à désérialiser objets pour créer, vous pouvez essayer d'utiliser le sixième mode énumération. Si vous avez d'autres besoins particuliers, vous pouvez envisager d'utiliser un quatrième double contrôle le mode de verrouillage.