Создание экземпляров, используя один общий заводской метод

Я пытаюсь найти простой способ создания объектов во время выполнения на основе статического атрибута класса String, называемого NAME.

Как я могу улучшить этот код, который использует простую конструкцию if?

public class FlowerFactory {

private final Garden g;

public FlowerFactory(Garden g) {
  this.g = g;
}

public Flower createFlower(final String name) {
    Flower result = null;

   if (Rose.NAME.equals(name)) {
       result = new Rose(g);
   } else if (Oleander.NAME.equals(name)) {
       result = new Oleander(g);
   } else if ... { ... } ...

   return result;
}

newInstance () не может использоваться в этих классах, если я не удалю аргумент конструктора. Должен ли я построить карту (Map) всех поддерживаемых ссылок на классы цветов и переместить аргумент конструктора в метод установки свойств, или есть другие простые решения?

Справочная информация: моя цель - реализовать своего рода «саморегистрацию» новых классов Flower с помощью FlowerFactory.getInstance (). Register (this.NAME, this.class) , что означает что, судя по очень хорошим ответам, решения, основанные на самоанализе, подходят лучше всего.

5
задан mjn 9 February 2011 в 16:58
поделиться