有仿制药的抽象工厂

时间:2014-03-24 14:00:45

标签: c# domain-driven-design factory-pattern

我有一个非常复杂的域名,有各种规则和例外,我想知道抽象工厂是否可以帮助我走出丛林。

域名描述

网络中有各种不同的硬件设备。它们都有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端点。如何在没有枚举的情况下做到这一点?我是否需要为每个可能的设备和端点建立工厂?

2 个答案:

答案 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。