首页 > 解决方案 > 工厂模式,避免不同接口使用相同的开关盒

问题描述

我有一个实现 3 个不同接口的模型

public class CustomerRateSettingModel :  IBaseFactory, IHandleSearch, IHandleSearchAggregate

我对实现设计模式并尝试实现工厂模式来创建实例非常陌生。但是在编写 Factory 时我无法找到避免相同 Switch 语句的正确方法

  public static IHandleSearch GetClassInstanceForSearch(string className)
    {
        switch (className.ToLower())
        {
            case "customerratesettingmodel":
                return new CustomerRateSettingModel();

            default: return null;
        }
    }

    private static IBaseFactory ManufactureModel(string className)
    {
        switch (className.ToLower())
        {
            case "customerratesettingmodel":
                return new CustomerRateSettingModel();

            default: return null;
        }
    }

有没有正确的方法来处理这样的场景?

供参考:调用工厂的代码

  IHandleSearch instance = ModelFactory.GetClassInstanceForSearch(modelName);


 var modelResult = instance.GetSearch(indexName, searchHistory.SearchParameters);

标签: c#design-patternsinterfacefactory-pattern

解决方案


Dictionary<string,Func<object>>名称映射到对象制造商。使用asoperator 测试object是否符合所需接口:

static readonly IDictionary<string,Func<object>> Makers = new Dictionary<string,Func<object>> {
    ["customerratesettingmodel"] = () => new CustomerRateSettingModel()
};
public static IHandleSearch GetClassInstanceForSearch(string className) {
    return Construct<IHandleSearch>(className);
}
public static IBaseFactory GetClassInstanceForSearch(string className) {
    return Construct<IBaseFactory>(className);
}
private static T Construct<T>(string className) where T : class {
    if (!Makers.TryGetValue(className.ToLower(), out var makeObject) {
        return null;
    }
    return makeObject() as T;
}

推荐阅读