【问题标题】:Abstract Factory or Factory Method for types with different constructor arguments具有不同构造函数参数的类型的抽象工厂或工厂方法
【发布时间】:2017-12-10 17:09:23
【问题描述】:

我有一个工厂方法,如下所示。有没有更好的方法来设计这样我就不用用switch语句实现开闭原则了

public IPolicy CreatePolicy(Context context)
{
    IPolicy policy = default(IPolicy);
    ISettings settings = _settings.Get(context);
    Policy policyType = (Policy) Enum.Parse(typeof(Policy), settings.Policy);
    switch (policyType)
    {
        case Policy.Policy1:
            policy = new Policy1(_policy1Service, _logHandler);
            break;
        case Policy.Policy2:
            policy = new Policy2(_policy2Service, _logHandler);
            break;
        case Policy.Policy3:
            policy = new Policy3(_policy1Service, _policy2Service, _logHandler);
            break;
    }
    return policy;
}

【问题讨论】:

  • 你有没有想过创建一个泛型方法,其中IPolicy
  • 可以说您的代码确实尊重 OCP。 CreatePolicy 已关闭(调用它的客户即使添加新策略也无需更改)但在交换机的隐藏信息中对扩展开放。 OCP 说您有受保护的变体

标签: c# oop design-patterns abstract-factory


【解决方案1】:

假设枚举字面量与您的类名完全相同,您可以根据枚举字面量动态创建实例

public static IPolicy CreatePolicy(Policy policy)
{
    //Change this if the namespace of your classes differs
    string ns = typeof(Policy).Namespace;

    string typeName = ns + "." + policy.ToString();

    return (IPolicy)Activator.CreateInstance(Type.GetType(typeName));
}

也可以通过简单地添加它们来传递构造函数参数

return (IPolicy)Activator.CreateInstance(Type.GetType(typeName),
    _policy1Service, _logHandler);

由于这很不寻常,请考虑向IPolicy 添加一个 Initialize(...) 方法来传递这些参数以允许一个空的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2011-09-08
    • 2021-02-07
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多