工厂模式,避免不同接口使用相同的switch case
Factory pattern, Avoid same switch case for different interface
我有一个实现了 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);
创建一个 Dictionary<string,Func<object>>
以将名称映射到对象制造者。使用 as
运算符测试 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;
}
我有一个实现了 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);
创建一个 Dictionary<string,Func<object>>
以将名称映射到对象制造者。使用 as
运算符测试 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;
}