C# 工厂模式,避免不同接口使用相同的开关盒
我有一个实现3个不同接口的模型C# 工厂模式,避免不同接口使用相同的开关盒,c#,design-patterns,interface,factory-pattern,C#,Design Patterns,Interface,Factory Pattern,我有一个实现3个不同接口的模型 public class CustomerRateSettingModel : IBaseFactory, IHandleSearch, IHandleSearchAggregate 我对实现设计模式和尝试实现工厂模式来创建实例非常陌生。 但在编写工厂时,我无法找到适当的方法来避免使用相同的Switch语句 public static IHandleSearch GetClassInstanceForSearch(string className)
public class CustomerRateSettingModel : IBaseFactory, IHandleSearch, IHandleSearchAggregate
我对实现设计模式和尝试实现工厂模式来创建实例非常陌生。
但在编写工厂时,我无法找到适当的方法来避免使用相同的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);
制作一个字典,将名称映射到对象生成器。作为操作员测试对象是否符合所需界面:
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;
}
这不是标准的工厂模式。这看起来像某种依赖注入?工厂模式只会创建对象,而不使用字符串来查找对象。我认为您应该研究DI框架,如Unity of SimpleInjector@Liam:U是正确的,我应该发送指示符而不是类名,但是是的,我正在创建一个具体的对象runtime@mjwills:但必须有返回类型,对吗?另一方面,我正在使用由具体实例实现的接口函数,我已经成功地使用MEF实现了factory