如何写出最优美的工厂模式
提问
如何写出最优美的工厂模式
回答
首先定义什么是最优美
最优美代表着他:面对新增开放,面对修改关闭实践
那么如何实现呢?
我选择使用特性 + 反射
public ICommand? BuildCommand(string[]? args)
{
if (args == null || args.Length != 2)
throw new ArgumentException("请输入正确的命令和参数");
ICommand? command = null;
var assembly = Assembly.GetExecutingAssembly();
if (!Equals(null, assembly))
{
var typeInfos = assembly.DefinedTypes.Where(t =>
t.CustomAttributes.Select(r => r.AttributeType).ToList().Contains(typeof(CommandAttribute)));
var typeInfo = typeInfos.FirstOrDefault(r => r.GetCustomAttributes(typeof(CommandAttribute)).Any(w => ((w as CommandAttribute)!).Name.Equals(args[0])));//.GetCustomAttribute(typeof(CommandAttribute)) as CommandAttribute;
if (!Equals(typeInfo, null))
{
if (typeInfo.FullName != null)
{
var serviceProvider = ServiceProviderHelper.GetInstance().ServiceProvider;
if (serviceProvider != null)
command = assembly.CreateInstance(typeInfo.FullName, true, BindingFlags.Default, null,
new object[]
{
args[1],
serviceProvider.GetService<IQualityControl>() ??
throw new InvalidOperationException()
}, null, null) as ICommand;
}
}
}
return command;
}
定义的特性
[AttributeUsage(AttributeTargets.Class)]
public class CommandAttribute : Attribute
{
public string Name { get; set; }
public CommandAttribute(string name)
{
Name = name;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现