[ C++ ] デザインパターン - シングルトンパターン

目次

1.デザインパターン:

2.シングルトンモード

飢えた男モード

レイジーモード

空腹モードと怠惰モードのメリットとデメリット


1.デザインパターン:

デザイン パターン (デザイン パターン) は、繰り返し使用されるセットであり、ほとんどの人が知っているだけで、分類後、コード デザインの経験をまとめたものです。なぜデザインパターンというものがあるのですか?コードの再利用性を高め、他の人がコードを理解しやすくし、コードの信頼性を確保するためです。デザイン パターンは、コードを使用して実際のエンジニアリングを記述します。デザイン パターンは、建物の構造と同様に、ソフトウェア エンジニアリングの基礎です。

2.シングルトンモード

クラスは 1 つのオブジェクトしか作成できません。つまり、シングルトン モードでは、システム内にクラスのインスタンスが 1 つだけ存在することが保証され、それにアクセスするためのグローバル アクセス ポイントが提供されます。このアクセス ポイントは、すべてのプログラム テンプレートによって共有されます。

たとえば、サーバー プログラムでは、サーバーの構成情報がファイルに格納され、これらの構成データがシングルトン オブジェクトによって一律に読み取られ、サービス プロセス内の他のオブジェクトがこのシングルトン オブジェクトを介して構成情報を取得します。このアプローチにより、複雑な環境での構成管理が簡素化されます。

シングルトン モードには、ハングリーマン モードレイジーマン モードの 2 つの実装モードがあります。

飢えた男モード

ハングリーマン モード:将来使用するかどうかに関係なく、プログラムの開始時に一意のインスタンス オブジェクトが作成されます。シングルトン オブジェクトの初期化は、プログラム エントリの前に完了します。このシングルトン オブジェクトがマルチスレッドの高同時実行環境で頻繁に使用され、高いパフォーマンスが要求される場合は、ハングリーマン モードを使用してリソースの競合を回避し、対応する速度を向上させる方が明らかに優れています。

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;

レイジーモード

遅延モード:プラグインのロード、ネットワーク接続の初期化、ファイルの読み取りなど、シングルトン オブジェクトの構築に時間がかかるか、多くのリソースを消費する場合、オブジェクトが使用されない可能性があります。プログラムの実行中は、プログラムの開始時に作成する必要があります。初期化により、プログラムの開始が非常に遅くなります。したがって、この場合は遅延モード (遅延読み込み) を使用することをお勧めします。

注: マルチスレッド環境では競合が発生する可能性があるため、レイジー モードはロックする必要があります。

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;

空腹モードと怠惰モードのメリットとデメリット

  • 飢えた男モード
  1. メリット:シンプル
  2. 短所: プロセスの起動が遅くなる可能性があり、シングルトン クラスのオブジェクト インスタンスが複数ある場合、起動シーケンスが不明確になります。
  • レイジーモード
  1. 利点: オブジェクトは、インスタンス オブジェクトが初めて使用されるときに作成されます。プロセスは無負荷で開始されます。複数シングルトンインスタンス起動順序自由制御
  2. 短所:複雑

おすすめ

転載: blog.csdn.net/qq_58325487/article/details/129393056
おすすめ