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

Java 用于从模板生成对象的EJB3.1模式,java,design-patterns,ejb,Java,Design Patterns,Ejb,我正在搜索从模板对象生成对象的设计模式。在我的游戏中,我有不同种类的项目,它们将由模板对象生成 目前我通过继承解决了这个问题,每个模板实体都实现了以下方法: public Item generate(EntityManager em); 我的继承结构是: ItemTemplate -> creates an Item |_ ArmorTemplate -> creates and Armor

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

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

   public Item generate(EntityManager em);
我的继承结构是:

    ItemTemplate                  -> creates an Item
         |_ ArmorTemplate         -> creates and Armor
         |_ WeaponTemplate        -> creates an Weapon
         |_ ....and more ....
当我创建一个项目时,我将实体管理器传递给模板,并得到一个持久化对象。 例如,一件盔甲模板会给我一件持久的盔甲等等

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

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

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

提前谢谢。
您好,m

只要EJB是Java EE的域对象,就不可能将其注入模板对象:

弹簧可以:

不过,我可能会尝试将模板域对象与对象分发部分分离。(仅就我的理解而言: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);
    }
}
静态抽象类项{
T模板;
}
静态抽象类ItemTemplate{
抽象I createItem();
}
//JPA域对象:
静态类扩展项{}
静态类ArmorTemplate扩展ItemTemplate{
公共最终积分;
公共ArmorTemplate(整数生命点){
hitpoints=hitpoints;
}
@凌驾
装甲createItem(){
归还新盔甲();
}
}
//此POJO可以由CDI管理
静态类ItemDao{
//@注入公共实体管理器em;
公开的
列表createItemsFromTemplates(列表模板){
列表结果=新建ArrayList();
对于(T模板:模板){
I item=template.createItem();
item.template=模板;
//em.persist(项目);
结果.添加(项目);
}
返回结果;
}
}
公共静态void main(字符串[]args){
List armorTemplates=Arrays.asList(
新ArmorTemplate(100)、新ArmorTemplate(80));
List armorItems=new ItemDao().createItemsFromTemplates(armorTemplates);
用于(盔甲:盔甲){
System.out.println(armor.template.hitpoints);
}
}

您当前的实现与工厂模式有多大不同?这是一个工厂模式,每个模板都知道它必须返回哪个对象以及如何返回。但是我想知道是否可以用ejb解决方案来取代pojo风格,以获得依赖注入等好处。你这样说是什么意思:“从Hibernate我得到一个模板对象列表,我不想做一个实例来调用正确的工厂方法。”如果模板对象只是工厂,我只是将它们作为引用实体管理器的单例服务连接起来。确定哪些项位于ingame容器中,该容器是我第一次选择分配给它的所有模板对象时打开的。所以我有这个ItemTemplate对象列表,我从中生成我的项目,并将其添加到玩家可以拾取的容器中。因此,我的模板存储在数据库中,并分配给各种容器,在那里它们可以在我身上弹出。是的,这就是我的意思。我的问题是如何在不确定确切类型的情况下拆分它?非常有趣的解决方案!我会试验一下,看看是否更合适。谢谢大家!#