2008-10-08 84 views
12

程序接收消息列表(基本類型)。列表中的每條消息必須根據其類型(後代類型)進行處理。但是,不同的消息需要不同的輸入才能正確處理。Builder,Factory Method和Abstract Factory模式之間有什麼區別?

什麼是以下技術稱爲? (我沒有在編譯器中檢查過這個代碼)

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,那叫什麼?

什麼技術將是解決這個問題的最佳模式?

回答

10

它們都是工廠方法模式的示例。唯一的區別是第二個示例在其自己的靜態類中具有該方法。

這將是抽象工廠模式的一個例子:

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]; 
} 
+0

我會這樣做,但我只是使用DataDomain對象作爲示例。在我們的應用程序中,沒有封裝所有輸入值的類型,並且在某些情況下,這意味着將參數傳遞給一個方法不需要它。 – ilitirit 2008-10-08 20:39:41

2

在我的理解工廠方法 defnies抽象類型類,其中與代表,但具體類型的創建工作,隨後/實現類。 抽象工廠將爲一組相應類的製造商定義一個接口。 A 構建器只是簡單地構建一個對象,一步一步地對調用實例進行一些控制。

相關問題