2010-02-23 117 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