Mode singleton
La motivation est parfois importante pour n'avoir qu'une seule instance de la classe. Par exemple, un système ne doit avoir qu'une seule instance de gestion de fenêtres.
Le modèle Singleton est le modèle de conception le plus simple: la classe est responsable de l'instanciation, garantissant qu'il n'y a qu'une seule instance et fournissant une entrée pour accéder à cette instance.
But
1. Assurez-vous qu'une seule instance est créée.
2. Fournissez une entrée pour accéder à cette instance.
Utilisez Final pour vous assurer qu'il est créé une fois, et le constructeur privé garantit qu'il n'est pas instancié. La méthode GetInstance du public garantit que l'accès externe est possible. Ce qui suit est le mode affamé:
classe publique Singleton {Instance singleton finale statique privée = new Singleton (); private singleton () {} public static singleton getInstance () {return instance; }}
Mode paresseux:
classe publique singletondemo {instance privée singletondemo volatile statique privée = null; private singletonDemo () {} public static singletonDemo getInstance () {if (instance == null) {synchronisé (singletondoMo .class) {if (instance == null) {instance = new singletondemo (); }} return instance; }}
Scénarios et exemples applicables
1. La classe Logger empêche la création d'une instance d'enregistrement à chaque fois que le journal est imprimé.
2. Classe de contrôle, il n'y a généralement qu'une seule instance de contrôle dans l'ensemble du système.
Problèmes et implémentations spécifiques
1. Le mode singleton robuste et robuste doit être en filetage.
2. Le mode paresseux utilise un mécanisme de verrouillage double.
3. Le mode Eagle utilise des variables statiques et est instanciée lorsque le programme est chargé, garantissant qu'il n'y a qu'une seule instance.
4. Les méthodes abstraites de l'usine et de l'usine sont généralement conçues comme des modèles singleton pour s'assurer qu'il n'y a qu'une seule usine.
5. Lors de l'utilisation de la sérialisation et de la désérialisation, plusieurs instances seront créées. Utilisez la fonction ReadResolve pour éviter cela, mais il est préférable de ne pas utiliser la sérialisation.
classe publique Singleton implémente Serializable {... // Cette méthode est appelée immédiatement après un objet de cette classe désérialisé. // Cette méthode renvoie l'instance singleton. objet protégé readResolve () {return getInstance (); }}
Points clés
1. Dans les programmes multi-thread, faites attention à la synchronisation des données.
2. Lors de la sérialisation, utilisez la méthode ReadResolve pour renvoyer l'instance pour éviter que plusieurs objets soient créés.
3. Si elle est chargée par plusieurs chargeurs de classe, plusieurs instances seront créées.
Mode d'usine simple
Le modèle simple de motivation en usine est la base et la mise en œuvre préliminaire des méthodes abstraites d'usine et d'usine.
But
1. Ne divulguez pas les détails de l'instanciation des objets au client.
2. Créez un objet via une interface commune.
accomplir
L'implémentation est très simple:
1. Lorsqu'un client a besoin d'un produit, il n'utilise pas de nouveau pour le créer, mais fournit une description de produit à l'usine, permettant à l'usine de fournir un nouveau produit.
2. L'usine instancie un produit au client.
3. Client utilise un produit abstrait, sans se soucier de la mise en œuvre du produit en béton.
Exemple
1. Programme de dessin pour les formes de dessin. La forme est l'interface du produit et les triangles sont le produit en béton. Nous pouvons créer une usine, puis créer le produit en fonction de la description du client. Cependant, lors de l'ajout de nouvelles formes, nous devons modifier la classe d'usine.
Problèmes et implémentations spécifiques
1. Lors de l'ajout de nouveaux produits, l'usine doit être modifiée.
classe publique ProductFactory {public Product CreateProduct (String productId) {if (id == id1) return new OneProduct (); if (id == id2) Renvoie un nouveau autreProduct (); ... // ainsi de suite pour les autres ids renvoie null; // Si l'ID n'a aucune des valeurs attendues} ...}Généralement, nous utilisons la déclaration IF pour juger la description du produit et instancier différents produits. Lorsqu'il y a de nouveaux produits, nous devons ajouter de nouveaux jugements. Ce problème peut être résolu par des modèles d'usine abstraits.
Résumer
1. Utilisez-le uniquement lorsque vous avez vraiment besoin de mode d'usine, sinon cela augmentera simplement la complexité du programme. Par exemple, lorsque plusieurs objets ont des types de base similaires, vous pouvez envisager d'utiliser un mode d'usine simple pour créer des objets uniformément.
2. Les usines simples ont plus de déclarations de branche de jugement, ce qui viole le principe de l'ouverture et de la fermeture des modifications. Par conséquent, il est sage d'utiliser le mode d'usine simple pour certains programmes fixes et simples, et d'utiliser le mode d'usine abstrait ou la méthode d'usine pour certains programmes complexes et fréquemment élargis.