2010-02-23 152 views
0

我需要通過從文本文件中讀取其描述來創建對象。 目的,可以在層次結構或可以是裝飾物 例如從描述中創建對象

對於本descrition在文本文件中:

Sample.txt的


甲的FileReader 「FILENAME.TXT」

緩衝的FileInput閱讀器「FileName.txt」

緩衝的StringInput閱讀器「TestStri NG」


程序應仔細閱讀本說明,並返回合適的讀者

new FileReader("fileName.txt")

new BufferedReader(new FileReader("FileName.txt"))

new BufferedReader(new StringReader("TestString"))

有什麼辦法來實現它的列表? 工廠模式可以用來實現這個恕我直言。

回答

1

當然,你可以用工廠做,但對我來說,這聽起來更像是一個Builder的工作。 (您當然可以使用Factory界面,並將其作爲Builder來實現)。

構建者更適合創建基於不同輸入的複雜對象層次結構,就像你的情況一樣。我的第一個想法是使用Map<String, Class>並向後解析文件中的行:最後一個參數是文件名,然後每個單詞(組)將映射到一個特定的類,通過傳遞前一個結果來實例化該類。

0

如果你所有的真實案例都是如此簡單的例子,那麼你可以使用你喜歡的東西(即你之前已經使用過的東西)。

但是,如果存在更復雜的情況,那麼您應該首先提供某種解析器。即使是在你的例子最後一個字符串它不是那麼簡單的生成必要的代碼:

public Object buildObject (Parser parser, Item param) { 
    if (!parser.hasNext()) { 
     return param.getValue(); 
    } 
    Item nextItem = parser.getNextItem(); //1st call: "TestString", 2nd call: "StringReader" 
    if (nextItem.isParameter()) {   //1st call: true, 2nd call: false 
     return buildObject (parser, nextItem); 
    } else if (nextItem.isClassName() { //2nd call: true 
     Class c = Class.forName (nextItem.getStringValue()); 
     Constructor ctr = c.getConstructor (param.getClassName()); //getClassName returns "String" 
     Object obj = ctr.newInstance (param.getValue()); 
     return buildObject (parser, new Item (obj)); 
    } else { 
     throw new ParseException ("Illegal input"); 
    } 
} 

這個代碼的和平仍然是非常錯誤(沒有的try/catch,沒有一些必要的邏輯),但是它演示基本的想法(這個想法是關於它不是那麼容易的任務)。

也許值得去尋找一些第三方庫(即使你必須犧牲你的文件格式並接受它們的格式)。

+0

你建議哪些第三方庫提供這種靈活性 – sushant 2010-02-23 12:57:35

+0

使用谷歌或在SO上提出單獨的問題 – Roman 2010-02-23 13:32:31