Использование шаблона factory для классов с разными параметрами

У меня очень простой factory, который принимает Enum в качестве одного из его параметров для определения типа объекта, который должен быть создан, и другого параметра, который является общим для всех создаваемых объектов.

Поскольку я добавляю больше типов для factory для создания параметров конструктора моего объекта, они начинают различаться, например:

public class someFactory {
    public someFactory() {
    }

    public SomeObject newObject(Type type, Object data) {
        return this.newObject(type, data, "");
    }

    public SomeObject newObject(Type type, Object data, Object stringOrObject) {
        SomeObject someObject = null;

        if (type != null) {
             switch(type) {
                 case CREATE:
                     someObject = new CreateObject(data);
                     break;
                 case DELETE:
                     someObject = new DeleteObject(data, (String)stringOrObject);
                     break;
                 case EDIT:
                     someObject = new EditObject(data, (Object)stringOrObject);
                     break;
                 default:
                     break;
             }
        }

        return someObject;
    }
}

Должен ли я использовать factory и просто создавать экземпляры разных типов с правильными аргументами или можно ли улучшить это выше, чтобы сделать его более гибким?

Ответ 1

Стандартная Java-задача - добавить метод к перечислению.

public enum Type {
    CREATE() {
        public SomeObject create(Object data, Object stringOrObject) {
            return new CreateObject(data);
        }
    },
    [...];
    public SomeObject create(Object data) {
        return create(data, "");
    }
    public abstract SomeObject create(Object data, Object stringOrObject);
}

Как указывает @Stas Kurilin, если вы можете избежать перечисления и просто вызвать методы статического создания соответствующих имен и параметров, тогда вы решаете множество проблем.

(Несколько других случайных точек: обычно лучше бросать исключение, чем принимать null или неизвестное значение. Попытайтесь использовать сильную типизацию, а не Object. Придерживайтесь условных обозначений Java, таких как имена с заглавными именами.)

Ответ 2

Я бы создал интерфейс, который выглядит как

public interface IFactory
{
    SomeObject Create(Object data, String orObject);
    Boolean AppliesTo(Type type);
}

Затем вы можете иметь класс Factory, который содержит список из трех из этих IFactories для Create, Delete и Edit и может запросить список этих фабрик для первого, который отвечает true методу AppliesTo.

Ответ 3

Создайте интерфейс со следующей подписью,

public interface IFactory
{
    GenricType Create(object data, string orObject);

}

и другие объекты реализуют этот интерфейс. Так что создание остается с объектом. Factory рисунок хороший. Но, поскольку вы используете перечисления для идентификации типа, было бы лучше использовать полиморфизм, чтобы он стал обслуживаемым.