1

これが他の場所で回答されている場合は申し訳ありません...似たようなものについて多くの投稿を見つけましたが、同じではありません。

オブジェクトのインスタンスが一度に 1 つしか存在しないようにしたいのですが、Singleton パターンの場合のように、そのオブジェクトが自然なライフサイクルを超えて保持されることは望ましくありません。

リストの処理が(私が制御できない外部コードによって)トリガーされるコードを書いています。現在、毎回新しい「処理」オブジェクトを作成するだけで、通常どおり、スコープ外になると破棄されます。ただし、処理に 1 分以上かかる場合があるため、次のトリガーによって新しいスレッドで処理クラスの 2 番目のインスタンスが作成されます。

ここで、一度に 1 つのインスタンスしか存在できないメカニズムが必要です...たとえば、一度に 1 つのオブジェクトのみを許可するある種のファクトリです。ファクトリへの 2 回目の呼び出しは、新しいオブジェクトの代わりに null を返します。

これまでのところ、私の(くだらない)解決策は、プロセッサ クラスのネストされたクラスとして Factory タイプのオブジェクトを使用することです。

class XmlJobListProcessor
{
    private static volatile bool instanceExists = false;

    public static class SingletonFactory
    {
        private static object lockObj = new object();

        public static XmlJobListProcessor CreateListProcessor()
        {
            if (!instanceExists)
            {
                lock (lockObj)
                {
                    if (!instanceExists)
                    {
                        instanceExists = true;
                        return new XmlJobListProcessor();
                    }
                    return null;
                }
            }
            return null;
        }
    }

    private XmlJobListProcessor() { }
    ....
    }

「instanceExists」フィールドを false にリセットする XmlJobListProcessor クラスの明示的なデストラクタを作成することを考えていました。

私はこれが非常にひどい設計であることを認識しています。ファクトリはそれ自体がクラスである必要があります...それとインスタンスデストラクタの両方が揮発性ブール値にアクセスできるようにネストされているだけです...

これを行うためのより良い方法はありますか?乾杯

4

5 に答える 5