Использование фабричного шаблона для классов с разными параметрами - PullRequest
10 голосов
/ 06 декабря 2010

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

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

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

Если я не использую фабрику и просто создаю экземпляры различных типов с правильными аргументами или могуВыше что-нибудь улучшить, чтобы сделать его более гибким?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

Стандартная вещь 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, такими как прописные имена типов.)

1 голос
/ 06 декабря 2010

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

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

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

0 голосов
/ 07 декабря 2010

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

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

}

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

...