【问题标题】:EJB 3.1 Pattern for generating objects from a template从模板生成对象的 EJB 3.1 模式
【发布时间】:2023-03-29 13:29:01
【问题描述】:

我正在寻找一种设计模式来从模板对象生成对象。在我的游戏中,我有不同类型的项目,这些项目将从模板对象中生成。

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

   public Item generate(EntityManager em);

我的继承结构是:

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

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

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

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

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

提前致谢。 问候,米

【问题讨论】:

  • 您当前的实现与工厂模式有何不同?
  • 这是一种工厂模式,每个模板都知道它必须返回哪个对象以及如何返回。但是如果 pojo 样式可以替换为 ejb 解决方案以获得依赖注入等的好处,我会更担心。
  • 这是什么意思:“从 Hibernate 我得到一个模板对象列表,我不想做一个 instanceof 来调用正确的工厂方法。”如果模板对象只是工厂,我会将它们作为单例服务连接到实体管理器的引用。
  • 确定哪些项目在第一次打开的游戏容器中,我选择分配给它的所有模板对象。所以我有这个 ItemTemplate 对象列表,我从中生成我的项目并将其添加到玩家可以拾取它的容器中。所以我的模板存储在数据库中并分配给各种容器,它们可以在游戏中弹出。

标签: java design-patterns ejb


【解决方案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);
    }
}

【讨论】:

  • 是的,这就是我的意思。我的问题是如何在不确定确切类型的情况下拆分它?
  • 非常有趣的解决方案!我会尝试它并决定它是否更合适。谢谢!#
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2021-01-06
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多