2014-03-24 123 views
0

我有不同的规则和例外一个相当复杂的领域,我不知道,如果抽象工厂可以帮助我走出这片丛林中。抽象工厂泛型

域描述

有一网络中的各种不同的硬件设备。他们都有一个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 

} 

,我想创建一个具有一组预定义的3个RTSP端点和1个ONVIF端点SpecialDeviceTransmitter的新实例。没有枚举我怎么能做到这一点?我是否需要为每种可能的设备和终端提供工厂?

回答

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创造来实现,以及。 我在这里省略了错误检查。

0

有关实现细节,您的SpecialDevice类可能有一个bool值,称为IsReceiver,它将根据实际设备的配置进行设置。然而,这假设它只能是其中的一个。

对于您的SpecialDeviceEndPoint s,您可以使用EndPoint的集合,就像您在IPCamera中所做的那样。如果你想知道什么样的终点您的设备支持,你可以使用一个[Flags]枚举像这样:

[Flags] 
    public enum EndpointFlags 
    { 
     Onvif = 0x10, 
     Rtsp = 0x100, 
    } 

并调用HasFlag,以确定您的设备是否支持特定类型的端点。