Фабричный образец, использующий Java для класса входных параметров - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть метод, который возвращает уважаемую фабричную базу по поведению, он должен возвращать уважаемый фабричный объект. Как я должен реализовать это с помощью 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 ]

2 голосов
/ 06 сентября 2011

Я бы предложил вам создать 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 голосов
/ 06 сентября 2011

Если я правильно понял ваш вопрос, я полагаю, что вы, по сути, спрашиваете, как вернуть соответствующий экземпляр из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...