gpt4 book ai didi

java - 用于从模板生成对象的 EJB 3.1 模式

转载 作者:行者123 更新时间:2023-11-29 06:10:33 24 4
gpt4 key购买 nike

我正在寻找一种设计模式来从模板对象生成对象。在我的游戏中,我有不同种类的元素,它们将从模板对象中生成。

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

   public Item generate(EntityManager em);

我的继承结构是:

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

当我创建一个项目时,我将实体管理器传递给模板,然后我得到一个持久对象。例如。 ArmorTemplate 返回一个持久化的 Armor 等等。

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

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

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

提前致谢。问候,m

最佳答案

只要 EJB 是 Java EE 的域对象,就不可能将 EJB 注入(inject)到模板对象中:

Inject EJB into domain object with Java EE 6

用 spring 是可能的:

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);
}
}

关于java - 用于从模板生成对象的 EJB 3.1 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7032249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com