代码之家  ›  专栏  ›  技术社区  ›  grefly

工厂法还是其他模式?

  •  2
  • grefly  · 技术社区  · 15 年前

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

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

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

    可能是在工厂里,一个案例陈述什么的。

    另一个想法是 StructureMap ,但我认为这对这种情况来说太过分了-你同意吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Dan Bryant    15 年前

    你可以考虑这样的事情:

    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
  •  2
  •   Oded    15 年前

    你说得对-a Factory 是本期的经典模式。

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

        3
  •  0
  •   Austin Salonen gmlacrosse    15 年前

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

    • 数据库
    • 反射

    Type ).

    既然你已经有了这个类型,剩下的就很简单了:

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