English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cet article, nous partageons avec vous l'exemple de code du modèle Singleton de conception Java, à titre de référence, voici le contenu détaillé :
Concept :
Modèle Singleton : une classe ne possède qu'un seul exemple.
Une classe a un seul et unique exemple, et fournit un point d'accès global.
Les raisons d'utiliser ce modèle :
Lorsque nous naviguons sur des sites Web, certains sites affichent le "Nombre d'utilisateurs en ligne actuels". Souvent, la méthode pour réaliser cette fonction consiste à stocker chaque IP connectée dans une mémoire, un fichier ou une base de données, et pour chaque IP supplémentaire, cela permet de réaliser "+1généralement, c'est une méthode, par exemple add(), pour réaliser le “+1fonction, par exemple, avec une instruction 'update', d'abord obtenir les données stockées dans la base de données, puis+1Mise à jour des données de la base de données, puis sauvegarde ; affichage sur la page, puis récupération des données de la base de données via une autre méthode. Mais, lors de la connexion simultanée de plusieurs utilisateurs, si chaque utilisateur doit créer une instance, puis appeler la méthode 'add()' via 'objet.methodeNom', puis stocker les données dans la base de données, cela entraînera plusieurs utilisateurs qui ne pourront pas enregistrer les données utilisateur réelles dans la base de données de manière précise. Par conséquent, concevoir ce compteur comme un objet global (tout le monde utilise ce même objet, pas un, pas un nouveau), tout le monde partage les mêmes données, cela évite des problèmes similaires, c'est ce que nous appelons une application de modèle singleton.
De même, on rencontrera des situations similaires dans d'autres scénarios, où l'on utilisera des idées similaires. Par exemple :
1. Ressources externes : chaque ordinateur a plusieurs imprimantes, mais il ne peut y avoir qu'un PrinterSpooler pour éviter que deux tâches d'impression ne soient envoyées simultanément à l'imprimante. Ressources internes : la plupart des logiciels ont (ou plusieurs) fichiers de propriétés pour stocker la configuration du système, un tel système devrait avoir un objet pour gérer ces fichiers de propriétés
2. Le Gestionnaire des tâches de Windows (Task Manager) est un modèle singleton très typique (c'est bien connu, n'est-ce pas ?). Pensez-y, pouvez-vous ouvrir deux gestionnaires des tâches de Windows ? Essayez-le vous-même, s'il vous plaît ~
3. La Corbeille de recyclage de Windows (Recycle Bin) est une application singleton typique. Pendant toute la durée d'exécution du système, la Corbeille de recyclage conserve un seul exemple.
4. Le compteur d'un site web utilise généralement le modèle singleton, sinon il est difficile de synchroniser.
5. L'application des journaux d'une application utilise généralement le modèle singleton, cela est généralement dû au fait que le fichier de journal partagé est toujours ouvert, car il ne peut y avoir qu'une seule instance pour l'exploiter, sinon il est difficile d'ajouter du contenu.
6. La lecture des objets de configuration d'une application Web utilise généralement le modèle singleton, c'est dû au fait que le fichier de configuration est une ressource partagée.
7. La conception d'un pool de connexions de base de données utilise généralement le modèle singleton, car une connexion de base de données est une ressource de base de données. L'utilisation d'un pool de connexions de base de données dans un logiciel de base de données consiste principalement à économiser les pertes d'efficacité causées par l'ouverture ou la fermeture de connexions de base de données, qui sont très coûteuses en termes d'efficacité. En utilisant le modèle singleton pour maintenir, cela peut réduire considérablement ces pertes.
8. La conception d'un pool de threads multithreadés utilise généralement le modèle singleton, c'est dû au fait que le pool de threads doit être facile à contrôler.
9. Le système de fichiers d'un système d'exploitation, aussi une exemple concret de la mise en œuvre du modèle singleton, un système d'exploitation ne peut avoir qu'un seul système de fichiers.
10. HttpApplication est également un exemple typique d'unité Singleton. Celui qui est familier avec le cycle de vie complet de la requête ASP.Net (IIS) sait que HttpApplication est également un modèle Singleton, et tous les HttpModule partagent une instance unique de HttpApplication.
En résumé, les scénarios d'application généraux du modèle Singleton sont :
1. Objet nécessitant une création fréquente et une destruction rapide.
2. Objet qui prend beaucoup de temps ou de ressources à créer, mais qui est utilisé fréquemment.
3. Objet d'outil de classe avec état.
4. Objet fréquemment accédé à la base de données ou aux fichiers.
5. Évite les performances ou les pertes causées par les opérations sur les ressources, comme les fichiers de journalisation et les configurations d'application mentionnés précédemment.
6. Facilite la communication entre les ressources contrôlées, comme les pools de threads.
Caractéristiques :
1、La classe Singleton ne peut avoir qu'une seule instance ;
2、La classe Singleton doit créer elle-même son instance unique ;
3、La classe Singleton doit fournir cette instance à tous les autres objets
Les éléments du modèle Singleton :
1. Constructeur privé
2. Référence statique privée pointant vers l'instance elle-même
3. Méthode publique statique qui renvoie l'instance elle-même
Il existe trois méthodes pour réaliser le modèle Singleton :
1. Le mode hungry singleton construit l'instance Singleton dès que la classe est chargée, en initialisation impérative (méthode de pré-chargement).
/** * Mode hungry singleton (recommandé) * */ public class Test { private Test() { } public static Test instance = new Test(); public Test getInstance() { return instance; } }
Avantages
1. Sécurité des threads
2. Un objet statique est déjà créé lors du chargement de la classe, ce qui permet une réaction rapide lors de l'appel.
Désavantages
L'efficacité des ressources n'est pas élevée, getInstance() peut ne jamais être exécuté, mais d'autres méthodes statiques de la classe peuvent être exécutées ou la classe est chargée (class.forName), et l'instance est toujours initialisée.
2. Le mode lazy singleton construit l'instance Singleton pour la première fois lorsqu'elle est utilisée, en inititalisation différée.
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { //Lorsque plusieurs threads déterminent que instance est null, une fois l'opération new exécutée, des situations de répétition peuvent se produire. instance = new Singleton2() } return instance; } }
Avantages
Il évite de créer des instances en cas d'utilisation, ce qui permet une utilisation efficace des ressources. Si getInstance() n'est pas exécuté, l'instance n'est pas créée, et d'autres méthodes statiques de la classe peuvent être exécutées.
Désavantages
Le mode lazy singleton fonctionne bien en mode mono-threadé, mais lorsque plusieurs threads accèdent en même temps, il peut créer plusieurs instances simultanément, et ces instances ne sont pas le même objet. Bien que les instances créées ultérieurement puissent couvrir les instances créées précédemment, il reste toujours une situation où des objets différents sont obtenus. La solution à ce problème consiste à utiliser le verrouillage synchronized, ce qui peut être lent au premier chargement et entraîner des coûts de synchronisation inutiles pour les threads multiples.
3.Double check
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { synchronized (Test.class) { if (instance == null) { instance = new Test(); } } } return instance; } }
Avantages
La récupération des ressources est élevée, sans exécuter getInstance() ne n'est pas实例, peut exécuter d'autres méthodes statiques de cette classe
Désavantages
La réaction n'est pas assez rapide au premier chargement, pour diverses raisons du modèle de mémoire Java, parfois échoue
4.Classe interne statique
class Test { private Test() { } private static class SingletonHelp { static Test instance = new Test(); } public static Test getInstance() { return SingletonHelp.instance; } }
Avantages
La récupération des ressources est élevée, sans exécuter getInstance() ne n'est pas实例, peut exécuter d'autres méthodes statiques de cette classe
Désavantages
La réaction n'est pas assez rapide au premier chargement
Résumé :
Généralement, il est utilisé le mode greedy, si vous êtes très attaché aux ressources, vous pouvez utiliser la classe interne statique, il est déconseillé d'utiliser le mode lazy et le double check
Voici la totalité du contenu de cet article, j'espère qu'il vous sera utile dans vos études et que vous soutiendrez davantage le tutoriel Néanmoins.
Déclaration : le contenu de cet article est extrait du réseau, propriété du propriétaire original, apporté par les utilisateurs d'Internet et téléversé spontanément. Le site Web ne détient pas de propriété, n'a pas été édité par l'homme et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, n'hésitez pas à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation et fournir des preuves. Une fois confirmée, le site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)