Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用设计模式实现建议_C#_Design Patterns - Fatal编程技术网

C# 通用设计模式实现建议

C# 通用设计模式实现建议,c#,design-patterns,C#,Design Patterns,我想就以下问题寻求一些建议 我有许多类,它们是许多USB硬件的包装器,例如总线可编程电源、标签打印机、数据采集模块、USB到串行转换器等 这些类中的每一个都实现了一个接口IHardwareDevice,定义如下 public interface IHardwareDevice { string VID { get; } string PID { get; } } // Example IHardwareDevice implementation public class Pow

我想就以下问题寻求一些建议

我有许多类,它们是许多USB硬件的包装器,例如总线可编程电源、标签打印机、数据采集模块、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"; }
    }
}
上述接口允许每个USB设备指定其自己的供应商和产品ID

我还有一个名为DeviceManager的静态类,它使用SetupDixxx设备安装函数来检测上面列出的任何USB设备的存在。此类还能够启用或禁用指定的设备

课程简介如下

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)
    {
        // ...
    }
}
公共静态类设备管理器
{
公共静态T Find(),其中T:IHardwareDevice,new()
{
//使用SetupDixxx调用查找VID和PID匹配
//根据是否找到匹配项,返回新的T()或默认值(T)
}
公共静态布尔启用(iHardware设备obj)
{
// ...
}
公共静态bool禁用(iHardware设备obj)
{
// ...
}
}
我曾考虑使用一个
HardwareDeviceAttribute
来装饰每个类(该属性将包含VID和PID),但我决定不这样做

此外,展望未来,我希望每个USB设备类都有自己的属性,例如USB到串行转换器的
PortName
,或HID设备的
PathName
(允许CreateFile、ReadFile和WriteFile访问),等等。所有这些都将根据从单个设备注册表分支读取的值填充(再次使用SetupDixxx函数调用)。我曾考虑扩展
IHardwareDevice
接口,以包含一个
InitializeDevice
方法,该方法将被DeviceManager调用,但这需要访问硬件类中的许多非托管结构,这似乎是不需要的。另一个选项是修饰USB设备的自定义属性,指示哪些属性将由
DeviceManager
填充

现在,我想我的问题是——这是不是一个很好的实现了我想要实现的目标?有什么明显的改进是我遗漏的吗?所有的代码都是有效的,所以从适用性的角度来看,这是绝对好的,但是有更好、更干净的实现吗?在这种情况下,工厂(或任何其他)模式能帮助我吗

提前感谢,,
我不是很确定,但我认为builder模式可能会对您有所帮助。如果通过构建器构造对象,则可以仅使用所需数量的属性进行初始化,而保留其他属性不变

是的,我相信工厂模式可以帮助你。如果您发现自己正在使用多组对象来执行对象创建活动,请考虑抽象工厂或甚至是DI容器。