2014-03-24 173 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,以確定您的設備是否支持特定類型的端點。