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:
static HungerSingleton singleObj;
};
HungerSingleton HungerSingleton::singleObj;
HungerSingleton
の静的メンバー変数はい独自の型のオブジェクト (またはポインタ)、カテゴリー静的メンバー変数main関数に入る前に初期化が完了しており、コンストラクタがプライベート化されているため、プログラム実行中にこのクラスのオブジェクトを作成することはできません。
- ハングリー シングルトン モードの利点:
- なぜなら子プロセスはメイン関数内でのみ作成できます、つまり、空腹のシングルトンクラススレッドの安全性の問題はありません他のスレッドのクラスとシステム リソースを競合することなく、マルチスレッドの高同時実行環境の場合タスクをより効率的に実行できる
- ハングリー シングルトン パターンの欠点:
- プログラム内に複数のシングルトン クラスがある場合、初期化順序を制御できません
- シングルトンクラスが飢えているとプログラムの起動速度が遅くなり、クラスが使用されていない場合でもインスタンスが作成されるため、メモリの無駄が発生する可能性があります。
レイジーモード
- プログラム内の遅延シングルトン クラスmain関数に入った後インスタンスを作成するかどうかは後続のコードによって決まります
class LazySingleton
{
public:
static LazySingleton* Getinstance()
{
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()
ときに、クラスはインスタンスを作成します。
- 遅延シングルトン パターンの利点:
- コントロールできるさまざまな遅延シングルトン クラス オブジェクトの初期化順序必要な場合にのみ作成されるため、メモリの無駄が回避されます。
- 遅延シングルトン パターンの欠点:
- マルチスレッド環境ではスレッドの安全性の問題があり、ロックが必要です