2011-01-04 7 views
3

私は別のライブラリによって遅延インスタンス化されたクラスを持っています。私はそのライブラリコードを制御することはできませんが、それでもクラスのインスタンスを複数作成できないようにする必要があります。シングルトンを遅延インスタンス化クラスにする方法は?

可能ですか?どうやって ?

+0

そのライブラリは "クラス"をインスタンス化しますか? – adatapost

+0

私は 'Lazy hisClass;を使用しています。したがって、' hisClass.Value'がアクセスされると、myクラスのデフォルトのコンストラクタが呼び出されます。 'Lazy'は次のアクセス時に同じインスタンスを返しますが、' myClass.Value'を呼び出すことはできませんが、誰もmyClassのインスタンスを複数作成できないようにしたいです。 – Xaqron

答えて

4

この質問にいくつかの簡単な解決策は、この問題を完全に理解するために私が最適解で終わり、次の資料

http://www.yoda.arachsys.com/csharp/singleton.html

の読書をお勧めします、いくつかの問題を隠し

public sealed class Singleton 
{ 
    Singleton() 
    { 
    } 

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

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
} 
+0

私はその記事を読んでいます。これは 'C# 'を使った' Singleton'パターンの実装の可能性についてあり、 'Lazy'インスタンス化の問題は何もしません。問題は、呼び出し側が 'Instance'プロパティを介して自分のクラスにアクセスしないことです。私はコンストラクタで何かする必要があります。それは私が持っているすべてです。 – Xaqron

+0

@Xaqron OIC。プロキシクラスは複数回インスタンス化でき、クラスと同じインターフェイスを実装する必要があります。次に、このプロキシクラスはシングルトンメソッドを呼び出します。 –

+0

+1単純な事実のために、JavaのDouble Checked Lockingが壊れているという話のWebページを指していました。 –

1

クラスのコンストラクタを呼び出す場合、インスタンスが以前に作成されたと判断した場合は、コンストラクタに例外をスローするしかありません。他のライブラリを制御できないため、通常はシングルトンへのアクセスを制御する方法であるファクトリメソッドまたは静的プロパティを使用することはできません。

状況に応じて、シングルトンインスタンスをラップする軽量プロキシを使用することもできます。この例では、任意の数のMyObjectProxyを作成できますが、その実装はすべてMyObjectの単一インスタンスに遅延されます。

public class MyObject { 

    internal MyObject() { 
    } 

    private int _counter; 

    public int Increment() { 
     return Interlocked.Increment(ref _counter); 
    } 

} 

public class MyObjectProxy { 

    private static readonly MyObject _singleton = new MyObject(); 

    public MyObjectProxy() { 
    } 

    public int Increment() { 
     return _singleton.Increment(); 
    } 

} 
+0

そして 'MyObjectProxy'が' MyObject'を返す場所は? – Xaqron

+0

私の例では、MyObjectProxyはMyObjectを返しません - それはシングルトンである基底のMyObjectにその呼び出しを委譲します。呼び出し元は、必要な数のMyObjectProxyインスタンスを作成できますが、常に同じカウンタをインクリメントします。 – Josh

+0

これはいいことですが、今は1つのインスタンスがありますが、そのライブラリは 'ICallerLibraryInterface'を実装する' myClass'を使って何かをやるつもりです。この方法では、 'MyObjectProxy'がそのライブラリで動作しないので、私はもっと大きな問題を抱えています。 – Xaqron

関連する問題