Вы можете использовать abstract factory pattern.
Создать абстрактный класс Factory
[или интерфейс], и классы, расширяющий его: MyObject1Factory
, MyObject2Factory
, ...
На предварительной обработки, заселить Map<String,Factory>
от String
к coresponding Factory
например, это делается только один раз в вашем приложении.
Когда вам нужно создать новый экземпляр - вызовите map.get(string).create()
, чтобы создать соответствующий объект соответствующего типа.
Edit: Небольшой пример с кодом:
Ваши классы:
public static class MyBase {
@Override
public String toString() {
return "Base";
}
}
public static class Class1 extends MyBase {
@Override
public String toString() {
return "Class1";
}
}
public static class Class2 extends MyBase {
@Override
public String toString() {
return "Class2";
}
}
И ваши заводы будут:
public static abstract class MyFactory {
public abstract MyBase build();
}
public static class MyFactory1 extends MyFactory {
@Override
public Class1 build() {
return new Class1();
}
}
public static class MyFactory2 extends MyFactory {
@Override
public Class2 build() {
return new Class2();
}
}
заполнить карту только один раз в жизни программы :
Map<String,MyFactory> map = new HashMap<String, Test.MyFactory>();
map.put("class1", new MyFactory1());
map.put("class2", new MyFactory2());
и когда вам нужен новый объект, вызовите с:
MyBase obj = map.get(s).build();
System.out.println(obj);
(*) Примечание: Статический ключевое слово для классов здесь, потому что я создал их как внутренние классы - вы, конечно, нужно ommit его, если он это не ваш случай.
Вы могли бы использовать регулярное выражение как «информация [0-9]» с совпадением? Но я не лучший способ. – Kiwy