[ C++ ] Modèle de conception - modèle singleton

Table des matières

1. Modèle de conception :

2. Mode singleton

mode homme affamé

mode paresseux

Avantages et inconvénients du mode faim et du mode paresseux


1. Modèle de conception :

Design Pattern (Design Pattern) est un ensemble d'utilisations répétées, la plupart des gens ne connaissent, après classification, qu'un résumé de l'expérience de conception de code. Pourquoi existe-t-il un design pattern ? C'est parce qu'il améliore la réutilisabilité du code, rend le code plus facile à comprendre pour les autres et garantit la fiabilité du code. Les modèles de conception utilisent le code pour écrire une véritable ingénierie ; les modèles de conception sont la pierre angulaire de l'ingénierie logicielle, tout comme la structure d'un bâtiment.

2. Mode singleton

Une classe ne peut créer qu'un seul objet, c'est-à-dire le mode singleton, qui peut garantir qu'il n'y a qu'une seule instance de la classe dans le système et fournir un point d'accès global pour y accéder, qui est partagé par tous les modèles de programme.

Par exemple, dans un programme serveur, les informations de configuration du serveur sont stockées dans un fichier, et ces données de configuration sont lues uniformément par un objet singleton, puis d'autres objets du processus de service obtiennent les informations de configuration via cet objet singleton, qui is Cette approche simplifie la gestion de la configuration dans des environnements complexes.

Il existe deux modes de mise en œuvre du mode singleton : le mode homme affamé et le mode homme paresseux

mode homme affamé

Mode Hungry man : peu importe s'il sera utilisé à l'avenir, un objet d'instance unique sera créé au démarrage du programme. L'initialisation de l'objet singleton est terminée avant l'entrée du programme. Si cet objet singleton est fréquemment utilisé dans un environnement multi-thread à forte concurrence et a des exigences de performances élevées, il est évidemment préférable d'utiliser le mode homme affamé pour éviter la concurrence des ressources et améliorer la vitesse correspondante.

class InfoMgr
{
public:
	InfoMgr(){}
	static InfoMgr* GetInstance()
	{
		return _spInst;
	}

	void SetAddress(const string& s)
	{
		_address = s;
	}
	string& GetAddress()
	{
		return _address;
	}

private:
	string _address;
	int _secretKey;

	InfoMgr(const InfoMgr&) = delete;
	InfoMgr& operator=(const InfoMgr&) = delete;

	static InfoMgr* _spInst;
};
InfoMgr* InfoMgr::_spInst = new InfoMgr;

mode paresseux

Mode paresseux : si la construction d'un objet singleton prend du temps ou prend beaucoup de ressources, comme le chargement de plug-ins, l'initialisation des connexions réseau, la lecture de fichiers, etc., et qu'il est possible que l'objet ne soit pas utilisé lorsque le programme est en cours d'exécution, il doit être créé au début du programme. L'initialisation entraînera un démarrage très lent du programme. Il est donc préférable d'utiliser le mode paresseux (lazy loading) dans ce cas.

Remarque : Le mode paresseux doit être verrouillé, car il peut y avoir concurrence dans les situations multithread.

class InfoMgr
{
public:
	static InfoMgr* GetInstance()
	{
		//这里需要加锁
		if (nullptr == _spInst)
		{
			_mtx.lock();
			if (_spInst == nullptr)
			{
				_spInst = new InfoMgr;
			}
			_mtx.unlock();
		}
		return _spInst;
	}

	void SetAddress(const string& s)
	{
		_address = s;
	}
	string& GetAddress()
	{
		return _address;
	}

private:
	InfoMgr() {}

	string _address;
	int _secretKey;

	InfoMgr(const InfoMgr&) = delete;
	InfoMgr& operator=(const InfoMgr&) = delete;

	static InfoMgr* _spInst;
	static mutex _mtx;//互斥锁
};
InfoMgr* InfoMgr::_spInst = nullptr;

Avantages et inconvénients du mode faim et du mode paresseux

  • mode homme affamé
  1. Avantages : simplicité
  2. Inconvénients : cela peut entraîner un démarrage lent du processus et s'il existe plusieurs instances d'objet de classe singleton, la séquence de démarrage est incertaine
  • mode paresseux
  1. Avantages : L'objet est créé lors de la première utilisation de l'objet d'instance. Le processus démarre sans charge. Contrôle sans ordre de démarrage de plusieurs instances singleton
  2. Inconvénients : compliqué

Guess you like

Origin blog.csdn.net/qq_58325487/article/details/129393056