Создание объектов по их описанию - PullRequest
0 голосов
/ 23 февраля 2010

Мне нужно создавать объекты, читая их описание из текстового файла.Объекты также находятся в иерархии или могут быть декоративными объектами. Например

Для этого описания в текстовом файле:

Sample.txt


FileReader "fileName.txt "

Буферизованное считыватель FileInput" FileName.txt "

Буферизованное считыватель StringInput" TestString "


Программа должна прочитать это описание и вернуть списокподходящих читателей

new FileReader("fileName.txt")

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

new BufferedReader(new StringReader("TestString"))

Есть ли способ добиться этого?Заводская модель может быть использована для достижения этого ИМХО.

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Конечно, вы можете сделать это с Фабрикой, но для меня это больше похоже на работу для Строителя . (Конечно, вы можете использовать интерфейс Factory и реализовать его как Builder).

Конструктор больше подходит для создания сложной иерархии объектов, основанной на различных входных данных, как в вашем случае. Моя первая идея - использовать Map<String, Class> и анализировать строки из файла в обратном направлении: последний параметр - это имя файла, затем каждое слово (группа) будет отображаться в определенный класс, который вы создаете, передав ему предыдущий результат.

0 голосов
/ 23 февраля 2010

Если все ваши реальные случаи настолько просты, как пример в вашем вопросе, то вы можете использовать то, что вам нравится (то есть то, что вы уже использовали ранее).

Но если существуют более сложные случаи, вы должны сначала предоставить какой-то синтаксический анализатор. Даже для последней строки в вашем примере не так просто сгенерировать необходимый код:

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, нет необходимой логики), но оно демонстрирует основную идею (и эта идея о том, что это не такая простая задача).

Может быть, стоит поискать некоторые сторонние библиотеки (даже если вам придется пожертвовать форматом своего файла и принять их формат).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...