我有一个非常复杂的域名,有各种规则和例外,我想知道抽象工厂是否可以帮助我走出丛林。
域名描述
网络中有各种不同的硬件设备。它们都有IP地址,但都是类型的发送器或接收器(可以根据其配置进行更改)。我如何访问它们(协议)以及这些访问点的外观取决于设备本身。
域
public abstract class NetworkDevice {
public IPAddress IpAddress { get; set; }
public List<Endpoint> Endpoints { get; set; }
public NetworkConfiguration NetworkConfiguration { get; set; }
}
public abstract class Endpoint {
public bool IsMulticast { get; set; }
public string PayloadType { get; set; }
}
public IPCamera: NetworkDevice {
// a IPCamera usually has various RTSP endpoints
// Is the following solution acceptable v
public List<RtspEndpoint> RtspEndpoints {
get {
return this.Endpoints.Where(x => x is RtspEndpoint);
}
}
}
public RtspEndpoint : Endpoint {
public string MediaControl { get; set; }
}
public abstract SpecialDevice : NetworkDevice {
// this device has RTSP and ONVIF endpoints
// and can be EITHER transmitter or receiver
// depending on configuration
}
public SpecialDeviceTransmitter : SpecialDevice {
// has RTSP & ONVIF endpoints
}
public SpecialDeviceReceiver {
// has only ONVIF endpoints
}
现在,我想创建一个SpecialDeviceTransmitter的新实例,它具有一组预定义的3个RTSP端点和1个ONVIF端点。如何在没有枚举的情况下做到这一点?我是否需要为每个可能的设备和端点建立工厂?
答案 0 :(得分:0)
您可以使用反射来调用不同类型的构造函数。例如。对于每种类型,您都可以创建一个接受端点数组并实现对象创建的构造函数,如下所示:
T CreateDevice<T>(params Endpoint[] endpts) where T: class
{
ConstructorInfo ctor = typeof(T).GetConstructor(new[] { typeof(Endpoint[]) });
return ctor.Invoke(new object[] { endpts}) as T;
}
也可以为各种类型的Endpoint
创建实现相同的模式。
我在这里省略了错误检查。
答案 1 :(得分:0)
对于实现细节,您的SpecialDevice
类可能有一个名为IsReceiver
的bool值,该值将根据实际设备的配置进行设置。然而,这假设它只能是两者中的一个。
对于EndPoint
的{{1}},您可以使用SpecialDevice
的集合,就像使用EndPoint
一样。如果您想知道设备支持哪种端点,可以使用IPCamera
枚举,如下所示:
[Flags]
并致电 [Flags]
public enum EndpointFlags
{
Onvif = 0x10,
Rtsp = 0x100,
}
以确定您的设备是否支持特定类型的EndPoint。