c# - 工厂模式,避免不同接口使用相同的开关盒
问题描述
我有一个实现 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
operator 测试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;
}
推荐阅读
- c - Bitwise arthmetric 这个结果是真还是假
- python - plt.subplots() 中的 sharey='all' 参数未传递给 df.plot()?
- r - 将 ggplot2 轮廓从其他方面移动到主要方面
- r - 调用同一列中的特定单元格(使用 dplyr?)
- sql - 和/或在访问和计算多个字段中
- swift - 动画 SKScene 背景颜色
- ios - 如何将 Apple Developer 权限添加到您已经制作的应用程序中
- java - 如何计算 BST 中的水平总和
- tensorflow - TFRecord 总是被截断
- jquery - 使用 jquery 使用 HTML 按钮在全景图像上水平滚动