Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java作为输入参数类的工厂模式_Java_Design Patterns - Fatal编程技术网

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

使用java作为输入参数类的工厂模式,java,design-patterns,Java,Design Patterns,我有一个方法,它根据行为返回受尊重的工厂,它应该返回受尊重的工厂对象。我应该如何使用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 EntiryFact

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

我建议您创建两个基类,一个用于实体,一个用于VO

例如:

public abstract class Entity implements Serializable {

}

public abstract class AbstractVO {


}
然后,为每个对象的工厂使用一个模式

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

如果我正确理解了您的问题,我相信您本质上是在问如何从
getCurrentBehavior(类行为)

由于参数是一个
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;
}

您的工厂是否有不同实现的通用抽象?
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;
}