2011-07-06 22 views
0

私は、後で様々な人が使うことができるライブラリを作っています。クラスの作成方法:特定の(一意の)フィールドを持つオブジェクトを1つだけ作成できます!

class WrapperMoveable 
{ 
    IMoveable moveable; 

    public WrapperMoveable(IMoveable moveable) 
    { 
     this.moveable = moveable; 
    } 
} 

問題:特定のIMoveableとexaclyつのオブジェクトが存在できることを確認するWrapperMoveableクラスを編集する方法について説明します。誰かが何らかのインターフェースを持つラッパー・オブジェクトを作成しようとしていて、そのインターフェースを持つラッパー・クラスがすでに存在する場合、機構は既存のラッパー・オブジェクトを戻すべきです。

私はいくつかの解決策を持っていますが、最初に問題点を考えてください。

ソリューション:

  1. すべて作成したラッパーオブジェクトが含まれているラッパークラスの静的フィールドを作成します。

    class WrapperMoveable 
    { 
        IMoveable moveable; 
    
        static List<WrapperMoveable> createdWrappers = new List<WrapperMoveable>(); 
    
        private WrapperMoveable(IMoveable moveable) 
        { 
         this.moveable = moveable; 
        } 
    
        public static WrapperMoveable CreateWrapper(IMoveable moveable) 
        { 
         if (createdWrappers.Any(e => e.moveable == moveable)) 
          return createdWrappers.First(e => e.moveable == moveable); 
    
         WrapperMoveable newWrapper = new WrapperMoveable(moveable); 
         createdWrappers.Add(newWrapper); 
    
         return newWrapper; 
        } 
    } 
    

    この方法の問題は、プログラマが新しいキーワードを使用して正常にオブジェクトを作成できないことです。したがって、プログラマは、静的メソッドによってのみオブジェクトを作成できることを知る必要があります。また、参照が常にcreatedWrappersに存在するため、garbridgeコレクターはオブジェクトを解放しません。

  2. ラッパークラスを作成するWrapperFactoryクラスを作成します。前の例のように、プログラマーはラッパーオブジェクトを作成する方法を知っていなければなりません。この解決策では、工場クラスを使用します。

  3. WrapperMoveableタイプのメモリ内のすべてのオブジェクトをスキャンし、オブジェクトに提供されたインターフェイスが含まれているかどうかを確認します。

あなたの意見ではこの問題のどのような解決策が最適ですか?あなた自身のよりよい解決策がありますか?

答えて

0

クラスにスタティックintを作成してカウントできますか? intが1より大きい場合は例外をスローしますか?

+0

投稿体をお読みください! – MaciejLisCK

+0

静的int = 0を作成します。参照カウントとして使用します。カウントがnewwrapperがすでに作成されていることを示している場合は、それを返します。あなたの後に何が望みますか? – Steve

0

'new'演算子を制御する場合は、工場パターンを使用することは唯一のクリーンな方法です。まず、あなたのクラスは、自分自身についての作成に関するいくつかの論理を知っています。 Factoryでは、このロジックをクラスから分離します。それは良いことです。

私は、作成ラッパーに余分なパラメータが必要だと思います。

public static WrapperMoveable CreateWrapper(IMoveable moveable, EndPoint ep) 
{ 
     if (createdWrappers.Any(e => e.EndpointObject == endpoint)) 

3番目のものについては、あなたは創造と処分をコントロールするいくつかのgcのようなリスナーを書くことができます。

しかし、問題はwrapperMoveableにあるようです。ラッパーを作成し、インスタンス化した後、そのエンドポイント・プロパティーを設定します。また、ラッパーの作成はそのプロパティーに関連しています(インスタンスのリストはフィルターリングプロパティーを知らない)。作成順序を逆にするとより効果的です。

+0

ああ、私はコードで間違いを犯す。今それは正しいです! – MaciejLisCK

+0

私は工場を使用することを恐れています。私が書いているように、コードはライブラリにコンパイルされるので、他の人が使用します。私は彼らがWrapperMoveableクラスを見つけたときに、クラスを作成する静的メソッドを見つけたほうが簡単だと思っています。 – MaciejLisCK

+0

クラスWrapperMoveable { IMoveable moveable; 静的なHashSet createdWrappers =新しいHashSet (); \tプライベートWrapperMoveable(IMoveable移動可能) { this.moveable = moveable; } \t \t \tパブリック静的WrapperMoveable CreateWrapper(IMoveable可動) {IF(createdWrappers.Any(E => e.moveable ==可動)) リターンcreatedWrappers.First(E => e.moveable ==可動); WrapperMoveable newWrapper = new WrapperMoveable(moveable); createdWrappers.Add(newWrapper); return newWrapper; } – MaciejLisCK

関連する問題