2011-08-11 45 views
1

我正在尋找設計模式以從模板對象生成對象。在我的遊戲中,我有不同類型的項目將從模板對象中生成。EJB 3.1用於從模板生成對象的模式

目前我解決它通過繼承,每個模板實體實現的方法:

public Item generate(EntityManager em); 

我的繼承結構是:

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

當我創建一個項目我通過實體管理模板我得到一個持久的對象。 例如一個護甲模板返回一個持續的護甲,等等。

如果項目生成需要任何特定的實體,我必須在生成方法內進行查找。我想用一個基於容器的解決方案來解決這個問題,我可以注入我需要的EJB,而不必通過創建工作流程來傳遞我的實體管理器。

從休眠我得到一個模板對象列表,我不想做一個instanceof調用正確的工廠方法。

我目前的解決方案有效,但感覺不是很優雅。任何輸入都可以。 ;-)

在此先感謝。 問候,男

+0

您目前的工廠模式與工廠模式有何不同? –

+0

那麼這是一個工廠模式,其中每個模板知道它必須返回哪個對象以及如何。但是,如果POJO風格可以用ejb解決方案替代以獲得依賴注入的好處等等,我就會更加靈活。 – mkuff

+0

這是什麼意思:「從休眠我得到一個模板對象列表,我不想做一個instanceof調用正確的工廠方法。」如果模板對象只是工廠,我只需將它們作爲單例服務連接到實體管理器的引用。 – tkr

回答

3

這是不可能注入的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); 
    } 
} 
+0

是的,那就是我的意思。我的問題是如何分割它而不確定確切的類型? – mkuff

+0

非常有趣的解決方案!我會試驗它,並希望它更適合。謝謝!# – mkuff