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

生成器、工厂方法和抽象工厂模式之间有什么区别?

  •  12
  • ilitirit  · 技术社区  · 17 年前

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

    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类注入到MessageProcessor(使用属性或Setter)中,然后调用Process,那么该调用什么呢?

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

    2 回复  |  直到 17 年前
        1
  •  10
  •   Mark Cidade    17 年前

    他们都是这种情况的例子 图案唯一的区别是,第二个示例在其自己的静态类中具有该方法。

    这将是一个例子 抽象工厂 模式:

    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];
     }
    
        2
  •  2
  •   DaSteph    17 年前

    据我所知 工厂法 抽象工厂 将为一组相应类的制造商定义一个接口。 A.

    推荐文章