Analyse du modèle de conception d'instance simple singleton
Préface
Aujourd'hui, je vais vous donner un résumé complet du modèle de conception le plus couramment utilisé en mode Android - Singleton.
En ce qui concerne l'introduction aux modèles de conception, vous pouvez lire ce que j'ai écrit avant: 1 minute pour bien comprendre les "modèles de conception"
Table des matières
1. Présenter
1.1 Quels problèmes sont résolus
Comme mentionné précédemment, conception modèle = une solution à un certain type de problème spécifique, alors quel problème est le modèle singleton ?
Signification: singleton = une instance;
Problème résolu: réduire le couplage entre les objets
Solution: modèle Singleton, c'est-à-dire en implémentant qu'une classe n'a qu'un seul objet instancié et fournit un point d'accès global
1.2 Introduction instance
Ensuite, j'utilise une instance pour introduire le modèle singleton
Contexte: Xiaocheng a une usine de plastiques, mais il n'y a qu'un seul entrepôt à l'intérieur.
Objectif: je veux utiliser le code pour implémenter la gestion des entrepôts
Pratiques actuelles: établir des entrepôts et des travailleurs
Parmi eux, la quantité dans la classe d'entrepôt = la quantité de marchandises; Les travailleurs ont les méthodes de manutention MoveIn (INT I) et Moveout (int i).
Problèmes: Grâce aux tests, il a été constaté que chaque fois qu'un travailleur se déplace, un nouvel entrepôt sera construit, c'est-à-dire que les marchandises ne sont pas placées dans le même entrepôt. Que se passe-t-il? (Voir le code ci-dessous)
package scut.designmodel.singletonpattern; // classe de classe entrepôt stophouse {private int quantity = 100; public void setquantity (int quantité) {this.quantity = quantité; } public int getQuantity () {return quantité; }} // Walking Human Class Carrier {public Storehouse Mstorehouse; Transport public (magasin de magasin) {mStorehouse = storehouse; } // Déplacer des marchandises dans l'entrepôt public Void Movein (int i) {mstorehouse.setquantity (mstorehouse.getquantity () + i); } // Déplacez-vous de l'entrepôt public Void Moveout (int i) {mstorehouse.setquantity (mstorehouse.getquantity () - i); }} // Gestion des travailleurs Test de classe publique SinglePattern {public static void main (String [] args) {storehouse mstorehouse1 = new Storehouse (); Storehouse mstorehouse2 = nouveau magasin (); Carrier Carrier1 = nouveau transporteur (MStorehouse1); Carrier Carrier 2 = nouveau transporteur (Mstorehouse2); System.out.println ("Les deux sont-ils les mêmes?"); if (mstorehouse1.equals (mStorehouse2)) {// Utiliser est égal ici au lieu du symbole ==, car le symbole == est juste pour comparer les adresses des deux objets System.out.println ("est le même"); } else {System.out.println ("n'est pas le même"); } // Après que le Porter ait déplacé les marchandises, signalez la quantité de marchandises dans l'entrepôt Carrier1.Movein (30); System.out.println ("Marge du produit de l'entrepôt:" + Carrier1.mstorehouse.getquantity ()); Carrier2.Moveout (50); System.out.println ("Marge du produit de l'entrepôt:" + Carrier2.mstorehouse.getquantity ()); }}résultat:
Les deux sont-ils les mêmes? Marge du produit dans le même entrepôt: 130 Entrepôt Margin de produit: 50
2. Introduction au modèle singleton
2.1 Problèmes résolus (scénarios d'application)
Conflit: D'après les résultats ci-dessus, on peut voir que les travailleurs opéraient évidemment le même cas d'entrepôt.
Objectif: Tous les travailleurs exploitent la même instance d'entrepôt
Le modèle Singleton est une solution à ce type de problème: implémentez une classe avec un seul objet instancié et fournit un principe de travail du point d'accès global 2.2
En Java, nous exploitons ces classes en utilisant des objets (après l'instanciation des cours). L'instanciation de classe est effectuée via son constructeur . Si nous voulons implémenter qu'une classe n'a qu'un seul objet instancié, nous devons travailler sur le constructeur de la classe:
Implémentation générale du mode Singleton: (y compris les étapes d'utilisation)
classe publique Singleton {// 1. Créez une variable privée OurInstance (utilisée pour enregistrer une instance unique de Singleton) // 2. Instanciate Internal Private Static Singleton Ourinstance = New Singleton (); // 3. Privatiser le constructeur de la classe et empêcher les appels externes pour instancier Singleton privé () {} // 4. Définissez une méthode publique pour fournir un point d'accès unique global pour la classe // 5. Renvoie à l'extérieur une instance unique en appelant la méthode getInstance () public static singleton newInstance () {return OurInstance; }}OK, vous devez comprendre l'introduction et les principes du modèle singleton, non? Alors, résolvons le problème que «l'entrepôt n'est pas le même» qui est apparu au-dessus de Xiaocheng!
2.3 Exemple d'introduction
Xiaocheng utilise le mode Singleton pour améliorer le code de l'exemple ci-dessus:
package scut.designmodel.singletonpattern; import java.util.concurrent.locks.lock; importer java.util.concurrent.locks.reentrantlock; // singleton warehouse classe stophouse {// la quantité de produits d'entrepôt private intrimbery = 100; // Instancier le magasin statique privé Ourinstance = New Storehouse () ;; // Laissez l'appel externe la méthode getInstance () pour renvoyer l'instance unique. Public Static Storehouse GetInstance () {return OurInstance; } // Constructeur fermé Store privé () {} public void setQuantity (int quantité) {this.quantity = quantité; } public int getQuantity () {return quantité; }} // Carrier Man Class Carrier {public Storehouse Mstorehouse; Transport public (magasin de magasin) {mStorehouse = storehouse; } // déplacer des marchandises dans l'entrepôt public Void Movein (int i) {mstorehouse.setquantity (mstorehouse.getquantity () + i); } // Déplacez-vous de l'entrepôt public Void Moveout (int i) {mstorehouse.setquantity (mstorehouse.getquantity () - i); }} // Gestion des travailleurs Test de classe publique SinglePattern {public static void main (String [] args) {storehouse mstorehouse1 = storehouse.getInstance (); Storehouse mstorehouse2 = storehouse.getInstance (); Carrier Carrier1 = nouveau transporteur (MStorehouse1); Carrier Carrier 2 = nouveau transporteur (Mstorehouse2); System.out.println ("Les deux sont-ils les mêmes?"); if (mstorehouse1.equals (mstorehouse2)) {System.out.println ("est le même"); } else {System.out.println ("pas le même"); } // Après que le Porter ait déplacé les marchandises, signalez la quantité de marchandises dans l'entrepôt, Carrier1.movein (30); System.out.println ("Marge du produit de l'entrepôt:" + Carrier1.mstorehouse.getquantity ()); Carrier2.Moveout (50); System.out.println ("Marge du produit de l'entrepôt:" + Carrier2.mstorehouse.getquantity ()); }}résultat:
Les deux sont-ils les mêmes? C'est la même marge de base de l'entrepôt: 130 Marge de base de l'entrepôt: 80
Selon l'analyse des résultats, après avoir utilisé le modèle Singleton, il n'y a qu'une seule instance d'entrepôt dans la classe d'entrepôt, et il n'est pas nécessaire de s'inquiéter des porteurs qui entrent dans le mauvais entrepôt! ! !
2.4 Avantages
2.5 Inconvénients
3. Implémentation du mode singleton
3.1 situation générale
Style affamé (la méthode de mise en œuvre de Singleton la plus simple)
classe Singleton {private static singleton Ourinstance = new Singleton (); privé singleton () {} public static singleton NewInstance () {return OurInstance; }}Scénarios d'application:
Style paresseux
La plus grande différence entre paresseux et affamé est le moment de l'opération d'initialisation des singletons :
classe Singleton {private static singleton Ourinstance = null; private singleton () {} public static singleton newInstance () {if (OurInstance == null) {OurInstance = new Singleton (); } retourner ourinstance; }}Scénarios d'application:
3.2 Implémentation du mode Singleton sous Multithreading
Dans le cas de la lecture multithre:
Solution 1: synchroniser le verrouillage
Utilisez le verrouillage de synchronisation synchronisé (singleton.class) pour empêcher plusieurs threads d'entrer simultanément, ce qui a permis de instancier l'instance à plusieurs reprises.
classe Singleton {private static singleton Ourinstance = null; private singleton () {} public static singleton NewInstance () {synchronisé (singleton.class) {if (OurInstance == null) {OurInstance = new Singleton (); }} return OurInstance; }}Solution 2: Verrouillage à double vérification
Une couche de IF est ajoutée sur la base du verrouillage de synchronisation (sauf synchronisé (singleton.class)) est d'améliorer les performances une fois l'instance instanciée et la prochaine fois qu'elle entre, il n'a pas à exécuter la synchronisation (Singleton.Class) pour obtenir le verrouillage de l'objet, améliorant ainsi les performances.
classe Singleton {private static singleton Ourinstance = null; private singleton () {} public static singleton NewInstance () {if (OurInstance == null) {synchronisé (singleton.class) {if (OurInstance == null) {OurInSance = new Singleton (); }}} return OurInstance; }}Solution 3: classe intérieure statique
Lorsque la classe JVM se charge, les données sont garanties d'être synchronisées. Nous utilisons l'implémentation de la classe interne: créez des instances d'objet dans la classe interne.
Tant que l'application n'utilise pas la classe interne JVM, la classe Singleton ne sera pas chargée et l'objet Singleton ne sera pas créé, réalisant ainsi le chargement paresseux "paresseux" et la sécurité des threads.
classe Singleton {// L'objet Singleton ne sera créé que lorsque la classe intérieure est chargée de classe statique privée singleton2 {private static singleton Ourinstance = new Singleton (); } private singleton () {} public static singleton newInstance () {return singleton2.ourinstance; }}Solution 4: Types d'énumération
La méthode de mise en œuvre de singleton la plus simple et facile à utiliser (recommandée par "Java efficace")
Public Enum Singleton {// Définir un élément d'énumération, qui est une instance de l'instance de Singleton; public void dosomething () {}}Comment l'utiliser est comme suit:
Singleton singleton = singleton.instance; singleton.dosomething ();
5. Résumé
Cet article présente principalement le modèle Singleton, y compris les principes et les méthodes de mise en œuvre. Ensuite, je continuerai d'expliquer d'autres modèles de conception. Si vous êtes intéressé, vous pouvez continuer à y prêter attention.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!