1

シングルトンパターンについてこれまで読んだすべてのチュートリアルは次のとおりです。

 public sealed class Singleton
 {
      private static readonly Singleton instance = new Singleton();

      private Singleton(){}

      public static Singleton Instance
      {
         get 
         {
            return instance; 
         }
      }
 }

しかし、アプリケーションの有効期間中にそのインスタンスを 1 つだけ持つ必要があるアセンブリに既にクラスがあります。上記のパターンの使い方がわかりません。

たとえば、 Y という名前の dll にクラス X があるとします。以下のコードは正しいですか:

 public sealed class Singleton
 {
      private static readonly Y.X instance = new Y.X();

      private Singleton(){}

      public static Y.X Instance
      {
         get 
         {
            return instance; 
         }
      }
 }

これは真のシングルトンですか? そうでない場合、この状況を処理する正しい方法は何ですか?

4

2 に答える 2

1

私は次のようなものを使用します:

public static class Singleton<T>
   where T : new()
{
    private static readonly Lazy<T> instance = new Lazy<T>();

    public static T Instance
    {
        get
        {
            return instance.Value;
        }
    }
}

タイプパラメータとして任意のタイプを指定できるようにするために、ジェネリックスを使用するという考え方です。

レイジーは、オブジェクトの実際のインスタンスをインスタンス化するための単なる改善です。

これにより、Tのインスタンスを直接作成できなくなるわけではないことに注意してください...

于 2012-06-06T15:11:11.180 に答える
1

いいえ、シングルトンパターンではありません。新しいYX()を呼び出しているという事実は、誰でもそれを呼び出すことができることを意味します。これは、YX()の新しいインスタンスを明確に禁止するものではありません。

ただし、アプリケーションでYXのインスタンスを1つだけ参照するようにする必要がある場合は、コードは問題ありません。次に、Singleton.Instanceを呼び出すことで取得できます。

これは実際にはファクトリパターン(オブジェクトの作成専用のクラス)であり、シングルトンではなく、クラスXFactoryなどを呼び出すことをお勧めします。

于 2012-06-06T15:11:16.130 に答える