デザイン パターン: シングルトン パターンのノート

ここに画像の説明を挿入

1. シングルトンモード

  • クラス作成できるオブジェクトは 1 つだけです、このようなクラスの設計パターンはシングルトン パターンと呼ばれ、システム内でクラスインスタンスは 1 つだけ存在できます(そして親子プロセス共有)、典型的なシングルトン クラスは C++STL のメモリ プールです。
  • C++ シングルトン モードの基本的な設計アイデアは次のとおりです。
    • 民営化コンストラクタ、デフォルトを削除しますコピーコンストラクターそして代入演算子のオーバーロードオブジェクトが直接作成およびコピーされることを防止する
    • シングルトン オブジェクトのメモリ リソースはオペレーティング システムによって解放することも、デストラクターをカスタマイズして特別な操作を完了することもできます。

2. シングルトン モードの 2 つの実装

飢えた男モード

  • プログラム内の空腹のシングルトン クラスmain関数に入る前に~の一意のインスタンスを作成します
//饿汉单例模式
class HungerSingleton
{
    
    
public:
	//定义一个可以访问单例对象的静态接口
	static HungerSingleton* Getinstance()
	{
    
    
		return &singleObj;
	}
private:
	//构造函数私有化,防止对象被直接创建
	HungerSingleton() {
    
     cout << "单例对象创建" << endl; }
	//删除拷贝接口,防止对象被拷贝
	HungerSingleton(const HungerSingleton& single) = delete;
	HungerSingleton& operator=(const HungerSingleton& single) = delete;

private:
	//定义静态区的HungerSingleton成员
	static HungerSingleton singleObj;
	//也可以定义成指针,初始化时在堆上创建
	//static HungerSingleton* singleObj;
};
//初始化类的静态成员
HungerSingleton HungerSingleton::singleObj;
//初始化时在堆上创建
//HungerSingleton * HungerSingleton::singleObj = new HungerSingleton;
  • HungerSingleton静的メンバー変数はい独自の型のオブジェクト (またはポインタ)、カテゴリー静的メンバー変数main関数に入る前に初期化が完了しており、コンストラクタがプライベート化されているため、プログラム実行中にこのクラスのオブジェクトを作成することはできません。
  • ハングリー シングルトン モードの利点:
    • なぜなら子プロセスはメイン関数内でのみ作成できます、つまり、空腹のシングルトンクラススレッドの安全性の問題はありません他のスレッドのクラスとシステム リソースを競合することなく、マルチスレッドの高同時実行環境の場合タスクをより効率的に実行できる
  • ハングリー シングルトン パターンの欠点:
    • プログラム内に複数のシングルトン クラスがある場合、初期化順序を制御できません
    • シングルトンクラスが飢えているとプログラムの起動速度が遅くなり、クラスが使用されていない場合でもインスタンスが作成されるため、メモリの無駄が発生する可能性があります。

レイジーモード

  • プログラム内の遅延シングルトン クラスmain関数に入った後インスタンスを作成するかどうかは後続のコードによって決まります
//懒汉单例模式
class LazySingleton
{
    
    
public:
	//定义一个可以访问单例对象的静态接口
	static LazySingleton* Getinstance()
	{
    
    
		//若singleObj为空指针则创建单例对象
		if (singleObj == nullptr)
		{
    
    
			singleObj = new LazySingleton;
		}
		return singleObj;
	}
private:
	//构造函数私有化,防止对象被创建
	LazySingleton() {
    
     cout << "单例对象创建" << endl; }
	//删除拷贝接口,防止对象被拷贝
	LazySingleton(const LazySingleton& single) = delete;
	LazySingleton& operator=(const LazySingleton& single) = delete;

private:
	//定义成静态成员指针,初始化时在堆上创建
	static LazySingleton* singleObj;
};
//初始化时设置成空指针
LazySingleton * LazySingleton::singleObj = nullptr;
  • LazySingletonメンバーインターフェイスが初めて呼び出されるGetinstance()ときに、クラスはインスタンスを作成します。
  • 遅延シングルトン パターンの利点:
    • コントロールできるさまざまな遅延シングルトン クラス オブジェクトの初期化順序必要な場合にのみ作成されるため、メモリの無駄が回避されます。
  • 遅延シングルトン パターンの欠点:
    • マルチスレッド環境ではスレッドの安全性の問題があり、ロックが必要です
      ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_73470348/article/details/132324257