工厂方法还是其他一些模式?

时间:2010-11-01 13:56:12

标签: c# .net design-patterns factory

我有一个需要根据任务类型解析的Task实体。我会在类中封装特定类型的Task的逻辑,但是将类型与实现解析逻辑的类匹配的普遍接受的方法是什么?

我的第一个冲动是做一个工厂,比如:

TaskResolverFactory.GetForType(TaskType) // returns IsATaskResolver, which has a Resolve method

可能在工厂内部,一个Case语句或其他东西。

另一种想法是使用类似StructureMap的东西,但我认为这种情况有点过分 - 你同意吗?

我缺少哪些其他方法,以及更换大型Case / Switch语句的普遍接受的方法是什么?

3 个答案:

答案 0 :(得分:2)

你是对的 - Factory是这个问题的经典模式。

如果这是你需要做这种解决的唯一地方(而且逻辑很简单),我同意 - StructureMap 过度杀伤。

答案 1 :(得分:1)

你可能会考虑这样的事情:

public class TaskResolverAttribute : Attribute
{
    public Type ResolverType { get; private set; }

    public TaskResolverAttribute(Type resolverType)
    {
        if (!typeof(ITaskResolver).IsAssignableFrom(resolverType))
            throw new ArgumentException("resolverType must implement ITaskResolver");

        ResolverType = resolverType;
    }
}

public class MyTaskResolver : ITaskResolver
{
}

[TaskResolver(typeof(MyTaskResolver))]
public class MyTask
{
}

public static class TaskResolverFactory
{
    public static ITaskResolver GetForType(Type taskType)
    {
        var attribute =
            Attribute.GetCustomAttribute(taskType, typeof(TaskResolverAttribute)) as TaskResolverAttribute;
        if (attribute == null)
            throw new ArgumentException("Task does not have an associated TaskResolver");

        return (ITaskResolver)Activator.CreateInstance(attribute.ResolverType);
    }
}

答案 2 :(得分:0)

工厂是可行的方式。

至于big switch语句,您的其他选项包括:

  • 配置/查找文件
  • 数据库
  • 反射

我认为反射路径是最容易维护的,但是当你还没有类型时会出现复杂性(假设你的“类型”是Type)。

由于您已经拥有该类型,其余部分非常简单:

public static Task GetByType(Type taskType)
{
    return Activator.CreateInstance(taskType) as Task;
}