.net - 构建器、工厂方法和抽象工厂模式之间有什么区别?

标签 .net design-patterns

程序接收消息列表(基本类型)。列表中的每条消息都必须根据其类型(后代类型)进行处理。但是,不同的消息需要不同的输入才能正确处理。

下面的技术叫什么? (我没有在编译器中检查过这段代码)

abstract class MessageProcessor
{
    public static MessageProcessor GetProcessor(Message message, DataDomain data)
    {
        if (message.GetType() == typeof(FooMessage))
        {
            return new FooMessageProcessor(message, data.Name, data.Classification);

        }
        else if (message.GetType() == typeof(BarMessage))
        {
            return new BarMessageProcessor(message, data.AccountNo, data.CreditLimit);

        }
        else
            throw new SomeException("Unrecognized type");

    }

    public abstract void Process();     
}

这个呢?

static class MessageProcessorFactory
{
    public static MessageProcessor GetProcessor(Message message, DataDomain data)
    {
        if (message.GetType() == typeof(FooMessage))
        {
            return new FooMessageProcessor(message, data.Name, data.Classification);

        }
        else if (message.GetType() == typeof(BarMessage))
        {
            return new BarMessageProcessor(message, data.AccountNo, data.CreditLimit);

        }
        else
            throw new SomeException("Unrecognized type");
    }
}

如果我可以将 ProcessBuilder 类注入(inject) MessageProcessor(使用属性或 Setter)然后调用 Process,那么它叫什么?

什么技术是解决这个问题的最佳模式?

最佳答案

它们都是工厂方法模式的示例。唯一的区别是第二个示例在其自己的静态类中具有该方法。

这将是抽象工厂模式的示例:

abstract class MessageProcessorFactory
 { public abstract MessageProcessor GetProcessor
                                     (Message message, DataDomain data);
 }

class FooMessageProcessorFactory :  MessageProcessorFactory
 { public override MessageProcessor GetProcessor
                                     (Message message, DataDomain data)
    { return new FooMessageProcessor(data.Name, data.Classification);
    }
 }

每个 MessageProcessor 都有自己的工厂类,该工厂类利用多态性。

传递 ProcessBuilder 来创建流程将是策略模式:

class MessageProcessor
 { ProcessBuilder builder;

   public MessageProcessor(ProcessBuilder builder)
    { this.builder = builder;
    }

   public void Process()
    { builder.BuildMessage();
      builder.BuildProcess();
      builder.Process();
    }
 }

var mp = new MessageProcessor(new FooProcessBuilder());

最简单的解决方案是封装一个工厂方法:

static void Process(Message msg, DataDomain data)
 { var p = getProcessor(msg.GetType());
   p.Process(msg, data);
 }

如果已知类型数量较少,您可以使用一系列类型检查:

private static MessageProcessor getProcessor(Type msgType)
 { return   (msgType == typeof(FooMessage)) ? new FooMessageProcessor()
          : (msgType == typeof(BarMessage)) ? new BarMessageProcessor()
          :                                   new DefaultMessageProcessor();
 }

否则使用字典:

Dictionary<Type,MessageProcessor> processors;    

private static MessageProcessor getProcessor(Type msgType) 
 { return processors[msgType];
 }

关于.net - 构建器、工厂方法和抽象工厂模式之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/183773/

相关文章:

c# - 清除回发时的查询字符串

c# - 当它只有一位时如何获得两位小数

.net - 确定未使用的方法和属性

Java EE DAO/DTO(数据传输对象)设计模式

java - 使用相同参数的多个方法的设计模式

c# - 构造具有多种字体的字符串

.net - LINQPad 错误 : 'UserQuery' : cannot derive from sealed type 'My.Entity.Framework.CustomDataContext'

c++ - "inherit"另一个关系 (1 :N) relationship

c# - 如何使用断路器?

ruby-on-rails - 测试 Rails 时管理模型关联的复杂性