Modèle de conception créative: 1. Modèle singleton

Quest-ce quun modèle de conception créative?

(26 décembre 2020)

Les modèles de conception créative concernent la création ou le clonage de nouveaux objets dune classe. Le clonage se produit lorsquun type dobjet similaire existe déjà et au lieu dinstancier un nouvel objet, nous clonons lexistant.

Les différentes façons de créer des objets auront une grande influence sur la manière dont un problème est résolu. Différents langages ont donc un impact sur les motifs quil est possible dutiliser.

Motif singleton

Le motif singleton est utilisé lorsque nous navons besoin que dune seule instance dune classe. Par exemple, établir une connexion à la base de données dans une application, imprimer la file dattente de limprimante, utiliser des enregistreurs car ils nécessitent beaucoup de ressources. Dans tous ces cas, sil y a plusieurs instances, cela créera une confusion ainsi quune incohérence.

Ce modèle est utilisé lorsque linstance est partagée et accessible globalement dans lapplication. Sassurer que laccès aux ressources partagées est thread-safe est un très bon exemple où ce type de modèle peut être vital. lintention dun modèle Singleton est de fournir un accès global à une classe limitée à une seule instance.

Voyons comment lobjet est créé

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Maintenant, chaque fois quun objet de DummyClass est nécessaire, son constructeur est appelé et un objet est créé. Cest ce quon appelle linitialisation Eager.

Mais, dans le modèle singleton, nous navons besoin que dune seule instance dune classe. Disons que si une connexion DB est déjà configurée, nous n’avons pas besoin de créer une nouvelle connexion DB et devrions utiliser la connexion déjà existante. Voyons comment y parvenir.

Ici, nous avons limité la portée du constructeur à la classe elle-même. Ainsi, pour créer lobjet de cette classe, la méthode statique getDBConnection () de la classe doit être appelée. Il vérifiera ensuite si lobjet dbConnection est nul, puis créera un nouvel objet de connexion et retournera sinon retournera lobjet de connexion existant.

Cet exemple montre le concept de initialisation tardive . Cela signifie que nous ne créons pas lobjet de la classe à moins que cela ne soit vraiment nécessaire. Par conséquent, ce programme est plus efficace en termes de ressources.

Il y a des compromis au principe de conception Singleton. Sil y a plusieurs threads de calcul en cours dexécution, il peut y avoir des problèmes causés par les threads essayant daccéder à lobjet unique partagé.

Problèmes dans limplémentation ci-dessus

Maintenant, il est possible que deux les threads appellent en même temps la méthode getDBConnection et lobjet nest pas encore créé. Pour les deux threads, lobjet dbConnection sera nul et ils essaieront tous les deux de créer une nouvelle instance et de lutiliser à la place. Il est donc très important de sassurer quun seul thread peut accéder à getDBConnection à la fois afin que plusieurs instances ne soient pas créées.

Pour obtenir un thread -safe classe singleton est de rendre la méthode daccès globale synchronisée, de sorte quun seul thread puisse exécuter cette méthode à la fois.

Un seul thread peut accéder à ce bloc de code synchronisé à la fois

Vous pensez peut-être que le problème est résolu maintenant. Mais, malheureusement non! Pour appliquer la propriété singleton, nous plaçons un verrou sur la méthode statique getDBConnection, mais compromettons ses performances en même temps. Lorsquun objet est déjà créé, plusieurs threads doivent également attendre pour obtenir linstance existante de cet objet. Pouvons-nous faire quelque chose de mieux? Voyons voir.

Comme il est évident que, le verrouillage nest requis que lorsque linstance est nulle afin que différents threads ne créent pas plusieurs instances. Ainsi, nous pouvons mettre une condition synchronisée à lintérieur de la condition if où nous vérifions si linstance est nulle ou non, et ajouter une double vérification pour éliminer les scénarios de plusieurs instances.

En utilisation réelle, le motif singleton peut être implémenté de différentes manières. Il définit simplement lobjectif de base de ce modèle, mais limplémentation du code peut différer.

Tout cela est de mon côté. Jespère quil est clair maintenant, où, quand et comment utiliser le modèle de conception singleton. Vous pouvez vous référer au livre, le catalogue de modèles de conception de Gang of Four pour plus de compréhension.

Sil vous plaît laissez-moi savoir dans les commentaires ci-dessous, si vous avez des doutes. Si vous aimez ce blog, partagez-le avec vos amis. Joyeux génie logiciel!

Partie 2: