2012-11-07 63 views
2

我解析/處理來自許多不同流(具有不同格式)的數據,並且不同數據源的數量在我的系統中不斷增長。我有根據配置文件中的工廠類指定源給我適當的解析器/處理器對(守法的小共用接口)的東西要求是這樣的:如何模塊化大型工廠類?

static Foo* FooFactory::createFoo(source c, /*couple flags*/) 
{ 
    switch (c) 
    { 
     case SOURCE_A: 
     { 
     //3 or 4 lines to put together a parser for A, and something to process stuff from the parser 
      return new FooA(/*args*/); 
     } 
     break; 
     //too many more cases which has started to worry me 
     default: 
      return NULL; 
    }; 
} 

問題是作爲數的來源不斷增加,我面臨兩個問題。首先,當我編譯時,我發現自己拉了所有FooA, FooB, FooC, FooD, FooE...相關的代碼 - 即使我只關心構建一個二進制文件,我只會要求FooA。那麼怎麼去模塊化呢。第二個問題是,現在在SOURCE_A的情況下,我返回FooA,但是如果我對SOURCE_A感興趣,但是我有不同的解析方法,或許我想要FooA_simpleFooA_careful,但是能夠以即插即用的方式好?

出於某種原因,有一點讓我想到了構建二進制文件時鏈接器的-u選項......它以某種方式暗示了即插即用的概念,但我不確定什麼是一種好的方法問題會是。

+0

我不是抽象工廠的專家,所以我會將此作爲評論,而不是答案。如果你給每個源的'FooFactory'一個方法(例如'createFooA(...)','createFooB(...)'),那麼你將不必爲實際不使用的源提取代碼在二進制文件中。如果我理解你的問題,我*認爲*也解決了你的第二個問題。 – Beta

回答

1

那麼,你只需創建一個工廠界面,並在該工廠的子類型之間劃分邏輯。所以可能有一個libFooA的子工廠(類型/實例),另一個用於libFooB。然後,您可以簡單地創建一個複合工廠,具體取決於您要在特定方案/程序中支持的子因素/庫。那麼你甚至可以進一步細分工廠。您也可以爲您的複合類型創建工廠枚舉器,並取消所有切換邏輯。然後你可以對你的libFooA工廠實例說,以便在更高級別啓用謹慎模式或簡單模式。所以你的FooFactory實例和子類型的圖很容易變化,而類結構可能像樹。圖書館是最小化依賴關係的方法之一,但是可能有更合理的方法來劃分專門的子工廠。

0

我不確定你是否可以繞過導入FooA,FooB ...因爲在任何時候它們中的任何一個都可能被實例化。至於模塊化,我建議創建在switch語句中調用的輔助函數。