2011-08-17 24 views
4

私は次の問題にいくつかのアドバイスをお探しです。等バスプログラマブル電源、ラベルプリンタ、データ収集モジュール、シリアルコンバータにUSB、これらのクラスの各々が実装一般的なデザインパターンの実装のアドバイス

よう -

Iは、USBハードウェアの多くの部分のためのラッパーであるクラスの数を有します以下のように定義されたインタフェースIHardwareDevice、...

public interface IHardwareDevice 
{ 
    string VID { get; } 
    string PID { get; } 
} 

// Example IHardwareDevice implementation 
public class PowerSupply : IHardwareDevice 
{ 
    public string VID 
    { 
     get { return "0123"; } 
    } 

    public string PID 
    { 
     get { return "3210"; } 
    } 
} 

上記インターフェースは、独自のベンダーと製品ID者を指定するために、各USBデバイスを可能にします。

また、上記のUSBデバイスの存在を検出するためにSetupDixxxデバイスインストール機能を使用するDeviceManagerという静的クラスがあります。このクラスには、指定されたデバイスを有効または無効にする機能もあります。

次のようにクラスの概要は...

public static class DeviceManager 
{ 
    public static T Find<T>() where T : IHardwareDevice, new() 
    { 
     // Uses the SetupDixxx calls to find a VID and PID match 
     // returns new T() or default(T) depending on whether match was found 
    } 

    public static bool Enable(IHardwareDevice obj) 
    { 
     // ... 
    } 

    public static bool Disable(IHardwareDevice obj) 
    { 
     // ... 
    } 
} 

私は(属性がVIDとPIDが含まれます)で、各クラスを飾るためにHardwareDeviceAttributeを使用して検討していたが、私はこれに反対を決めました。

はまた、今後、私は自分の性質を持っているUSBデバイスクラスのそれぞれのための能力をしたい - シリアルコンバータにUSBについてPortName、またはHIDデバイスのためのPathNameとして(のCreateFile、ReadFile関数やWriteFile関数を許可しますアクセス)などが含まれます。これらはすべて、個々のデバイスのレジストリブランチから読み込まれた値(SetupDixxxファンクションコールを再度使用して)から読み込まれます。 IHardwareDeviceインターフェイスを拡張してDeviceManagerによって呼び出されるInitializeDeviceメソッドを含めることを検討しましたが、これは望ましくないようなハードウェアクラス内のいくつかの管理されていない構造体にアクセスする必要があります。もう1つの選択肢は、USBデバイスのカスタムプロパティを装飾して、DeviceManagerによって入力されることを示します。

今、私の質問は、これがそうであるか、これが私が達成したいと望んでいるものの良い実装だろうと思いますか?私が紛失しているような目立って明らかな改善はありますか?すべてのコードが動作するので、適切な観点からは、それは絶対にうまくいくが、より良いクリーンな実装がある - この場合、Factory(または他の)パターンが役立つだろうか?事前に

おかげで、 K

+0

はい、私はファクトリーパターンがあなたに役立つと思います。あなたが複数のオブジェクトセットを使ってオブジェクト作成の種類のアクティビティを実行していることが分かっている場合は、抽象ファクトリまたはDIコンテナを考慮してください。 – neontapir

答えて

1

は、私は非常によくわかりませんが、私はビルダーパターンがあなたに助けになるかもしれないと思います。ビルダを使用してオブジェクトを構築する場合、必要な数の属性で初期化し、他の属性は変更しないでください。 wiki link