2011-09-06 57 views
0

我有方法返回尊重的工廠基於行爲它應該返回尊重的工廠對象。我應該如何使用java實現這個?使用java作爲輸入參數類的工廠模式

public Object getCurrentBehaviour(Class behavior) { 

    //e.g behavior type is entity it should return entity factory 

    //if behavior type is VO it should return VO factory 

} 


class EntiryFactory{ 
} 

class VoFactory{ 
} 
+0

問題是什麼? – Andrey

+0

你的工廠有不同的實現有共同的抽象嗎? –

回答

2

我建議你創建2個基類,1個爲實體,1個爲VO。

實施例:

public abstract class Entity implements Serializable { 

} 

public abstract class AbstractVO { 


} 

然後,使用一個Abstract Factory圖案爲每個對象的工廠

public AbstractFactory { 

    private AbstractFactory() {} 

    public abstract Factory getFactory(Class clazz) { 
     if (Entity.class.isAssignableFrom(clazz)) { 
      return new EntityFactory(); 
     } 

     if (AbstractVO.class.isAssignableFrom(clazz)) { 
      return new VOFactory(); 
     } 

     return null; 
    } 
} 

我使用的是Class.isAssignableFrom()方法的說,子類的類是從父類分配(它如果你明白我想說的話)。這是這裏的訣竅。

對於這一點,我會做一個工廠爲每個對象

public abstract Factory<T> { 

    public abstract T createObject(); 
} 

public class EntityFactory extends Factory<Entity> { 

    public Entity createObject(Class entityClass) { 
     try { 
      return entityClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class VOFactory extends Factory<AbstractVO> { 

    public AbstractVO createObject(Class voClass) { 
     try { 
      return voClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

最後,得到了對象

Entity entity = (Entity)AbstractFactory.getFactory(Entity.class).createObject(); 
0

如果我理解正確你的問題,我相信你基本上是問如何返回getCurrentBehaviour(Class behaviour)

由於參數是一個Class對象,因此您可以使用Class.isAssignableFrom(Class c)來檢查此Class對象所表示的類或接口是否與指定的Class參數所表示的類或接口的類或接口相同,或者是其類的超類或超接口。

這裏所說:

public Object getCurrentBehaviour(Class behavior) { 

    if(behavior.isAssignableFrom(EntiryFactory.class) { 
     // create an instance of EntiryFactory 
    } 

    else if(behavior.isAssignableFrom(VoFactory.class) { 
     // create an instance of VoFactory 
    } 

    return created_instance; 
}