EJB 3.1 Шаблон для генерации объектов из шаблона - PullRequest
1 голос
/ 12 августа 2011

Я ищу шаблон проектирования для создания объектов из объекта шаблона.В моей игре у меня есть различные виды элементов, которые будут сгенерированы из объекта шаблона.

В настоящее время я решил это с помощью наследования, где каждая сущность шаблона реализует метод:

   public Item generate(EntityManager em);

Мое наследованиеСтруктура:

    ItemTemplate                  -> creates an Item
         |_ ArmorTemplate         -> creates and Armor
         |_ WeaponTemplate        -> creates an Weapon
         |_ ....and more ....

Когда я создаю элемент, я передаю менеджер сущностей в шаблон и получаю постоянный объект.Например, ArmorTemplate возвращает мне сохраненную броню и так далее.

Если для создания элемента нужны какие-либо конкретные объекты, я должен выполнить поиск в методе создания.Я хотел бы решить эту проблему с помощью решения на основе контейнера, в котором я могу внедрить необходимые EJB-компоненты и не должен передавать свой менеджер сущностей через рабочий процесс создания.

Из Hibernate я получаю список объектов-шаблонов и делаюне хочу делать instanceof для вызова правильного фабричного метода.

Мое текущее решение работает, но кажется не очень элегантным.Любой вклад будет в порядке.; -)

Заранее спасибо.привет, м

1 Ответ

3 голосов
/ 12 августа 2011

Невозможно внедрить EJB-объекты в объекты шаблона, если они являются объектами домена в Java EE:

Внедрение EJB в объект домена с помощью Java EE 6

Возможно с пружиной:

http://java.dzone.com/articles/domain-object-dependency-injection-with-spring

Однако, вероятно, я бы попытался отделить объект домена шаблона от части, сохраняющей объект. (просто для моего понимания: ArmorTemplate - это своего рода броня, и существует несколько разных с разными атрибутами, каждый ArmorItem является одним экземпляром ровно одного ArmorTemplate и может быть несколько элементов для одного шаблона)

Вот предложение. Сложная общая часть состоит в том, чтобы включить, что ArmorItem может быть создан только при помощи ArmorTemplate, и что вы можете получить доступ к определенным свойствам из этого шаблона без приведения.

static abstract class Item<I extends Item<I, T>, T extends ItemTemplate<I, T>> {
    T template;
}
static abstract class ItemTemplate<I extends Item<I, T>, T extends ItemTemplate<I, T>> {
    abstract I createItem();
}

// JPA Domain Objects:
static class Armor extends Item<Armor, ArmorTemplate> {}
static class ArmorTemplate extends ItemTemplate<Armor, ArmorTemplate> {
    public final int hitpoints;

    public ArmorTemplate(int hitpoints) {
        this.hitpoints = hitpoints;
    }

    @Override
    Armor createItem() {
        return new Armor();
    }
}

// This POJO can be CDI managed
static class ItemDao {
    // @Inject public EntityManager em;

    public <I extends Item<I, T>, T extends ItemTemplate<I, T>> 
    List<I> createItemsFromTemplates(List<T> templates) {
        List<I> result = new ArrayList<I>();
        for (T template : templates) {
            I item = template.createItem();
            item.template = template;
            // em.persist(item);
            result.add(item);
        }
        return result;
    }
}

public static void main(String[] args) {
    List<ArmorTemplate> armorTemplates = Arrays.asList(
            new ArmorTemplate(100), new ArmorTemplate(80));

    List<Armor> armorItems = new ItemDao().createItemsFromTemplates(armorTemplates);

    for (Armor armor : armorItems) {
        System.out.println(armor.template.hitpoints);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...