0

ソフトウェアの設定用のシングルトンクラスがあります。大規模なソフトウェアのさまざまな場所で、getInstanceを取得し、それを使用して、ファイルから設定クラスに既に読み込まれている設定にアクセスすることができます。でも:

  • 最初の呼び出しでは、「モデル名」(ソフトウェアがシミュレーションモデルをロードして実行する)を渡す必要があり、名前に基づいて、ソフトウェアは選択されたモデルの設定をロードします。

    Settings :: getInstance( "building1")

  • 後の呼び出しでは、「モデル名」を再度渡すことは望ましくありません(または場合によっては可能です)。したがって、モデル名なしで呼び出すことができれば理想的です。

このシナリオではどうすればよいですか?getInstanceメソッドが2つありますか?または、getInstanceを最初に呼び出す前に、Settingsクラスの静的変数に「モデル名」を設定しますか?または何?

4

3 に答える 3

2

2つgetInstance()のメソッドがあることは災害のレシピのように聞こえます:)クラスのユーザーは常に「どちらを使用しますか?」と尋ねると思います。誰かが最初に間違ったバージョンを呼び出した場合はどうなりますか?

2つの方法を使用する代わりにgetInstance()、静的変数アプローチを使用し、初期化フェーズの早い段階で設定する方がよいと思います。しかし、これもエラーが発生しやすいです。

さらに良いのは、インスタンス化時にモデル名を取得し、内部にシングルトンを持つある種のファクトリを検討することです。ファクトリは次のようになります。

class SettingsFactory
{
public:
    SettingsFactory(const std::string &modelName);
    Settings *getUniqueSettingsInstance();

private:
    SettingsFactory(); // cant instantiate the default ctor

    // put the singleton stuff here
};
于 2012-05-10T14:05:54.310 に答える
2

私はシングルトンが悪だと言う人ではありませんが、ここでは実際にシングルトンを使用するべきではありません。一般的な経験則:クラスに外部から何らかの形で認識できる状態がある場合、それはシングルトンであってはなりません。広く知られている理由から、グローバルな状態は避けるべきです。

いくつかの初期化が必要なため、クラスには明らかに状態があります。シングルトンにしないでください。コードを構造化する他の方法を見つけてください。

于 2012-05-10T14:11:42.940 に答える
0

私があなたを正しく理解しているなら、デフォルト値のgetInstance()メソッドをオーバーロードしてみませんNULLか?getInstanceをもう一度呼び出すときは、モデル名がaでNULL char*あるかどうかは関係ありません。これは、今回はオブジェクトを作成するためにモデル名が必要ないためです。

class Settings
{
   // ..
   static Settings * getInstance(char * modelName = NULL);
}
于 2012-05-10T14:06:10.073 に答える