ネストされたシングルトンクラス
-
21-09-2019 - |
質問
これは、C#で非シングルトンクラス内のシングルトンクラスをネストすることが可能であり、そうであれば、シングルトンのライフサイクルに任意の制限は、この場合にはあるのですか?
public class NonSingletonClass
{
public NonSingletonClass()
{
// Initialize some stuff.
}
// Put some methods here.
public class SingletonClass
{
// Singleton construction goes here.
// Put some methods here.
}
}
私のアプリケーションの設計では、これは理にかなって、私は、私は実際にこれを実装する前に、潜在的な落とし穴を知っている必要があります。
編集:具体的には、私は、実行タスクは、タイマーに基づいて、そのジョブのホストを持っています。この場合、NonSingletonClass
は、タスクのインスタンス化したものです。 SingletonClass
はNonSingletonClass
によって使用されるデータのリポジトリであるが、NonSingletonClass
の外部から変更することができます。 SingletonClass
は、複数のNonSingletonClass
インスタンスがある場合でも、まだそれらのすべてのための命令とデータのセットが1つだけになることを保証するために存在します。
解決
私はあなたがmonostateパターンを探していると信じています。
このリンクは良い本の説明とシングルトンパターンと申し出contratsです monostateパターンの
他のヒント
はい、シングルトンは非シングルトン内に完全に快適に生活することができます。
ネストされたクラスのライフサイクルは、外側のクラスのライフ・サイクルに完全に独立しています。 C#での入れ子になったクラスと非入れ子のクラスの間にはほとんど違いがあります。 (ありますのいくつかのの違い - ネストされたクラスは、外部クラスのprivateメンバにアクセスすることができ、かつ拡張メソッドは、たとえば、非ネストされた静的なクラスであることを持っている - しかし、それは影響を与えません。ライフサイクルます。
あなたが特定の懸念を持っていましたか?
私は私の最初の質問は、あなたが「これは理にかなって私のアプリケーションの設計」を述べ考慮私たちに多くの詳細を与えることができていると思います。抽象工場とビルダーはシングルトンクラスを使うだけでいくつかのpattersです。あなたはNonSingletonClass内で使用されるグローバルデータのいくつかの並べ替えを格納しています。
私はどちらのクラスが他の参照を保持していることを考慮すると、ネストされたシングルトンに問題があるとは思いません。あなたはシングルトンは、いくつかのインスタンスのための可変データストレージを提供することを言うことを考えると、私はあなたの潜在的な問題を並行処理関連であることを行っていると思います。
これらは、マルチスレッドのアクセスが許可されている場合、それは最初に、我々はシングルトンが有効な状態に常にあるように、適切なロックが整備されていることを確認する必要があり、あるのみ適用されます。そしてシングルトン状態が変化しており、オブジェクトは非決定論的順序でアクセスしている場合に、第2の、結果(すなわち競合状態)予測できません。
並行処理は、アプリケーションの問題でない場合は、、私は民間の入れ子になったクラスの使用は、実装の詳細を隠蔽し、各オブジェクトは一つだけな役割を持って確保する優れた方法であることがわかりました。