工厂模式使用java输入参数类

时间:2011-09-06 10:10:02

标签: java design-patterns

我有一个返回受尊重的工厂的方法基于它应该返回尊重的Factory对象的行为。我应该如何使用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{
}

2 个答案:

答案 0 :(得分:2)

我建议你创建2个基类,1个用于实体,1个用于VO。

示例:

public abstract class Entity implements Serializable {

}

public abstract class AbstractVO {


}

然后,为每个对象的Factory

使用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();

答案 1 :(得分: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;
}