有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于从模板生成对象的JavaEJB3.1模式

我正在搜索从模板对象生成对象的设计模式。在我的游戏中,我有不同种类的项目,它们将由模板对象生成

目前我通过继承解决了这个问题,每个模板实体都实现了以下方法:

   public Item generate(EntityManager em);

我的继承结构是:

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

当我创建一个项目时,我将实体管理器传递给模板,并得到一个持久化对象。 例如,一件盔甲模板会给我一件持久的盔甲等等

如果项目生成需要任何特定的实体,我必须在生成方法中进行查找。我想用一个基于容器的解决方案来解决这个问题,在这个解决方案中,我可以注入所需的EJB,而不必通过创建工作流传递实体管理器

从Hibernate中,我得到了一个模板对象列表,我不想执行instanceof来调用正确的工厂方法

我目前的解决方案有效,但感觉不是很优雅。任何输入都可以。;-)

提前谢谢。 你好,m


共 (1) 个答案

  1. # 1 楼答案

    不可能将EJB注入到模板对象中,只要它们是具有Java EE的域对象:

    Inject EJB into domain object with 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);
        }
    }