Использование шаблона 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 рисунок хороший. Но, поскольку вы используете перечисления для идентификации типа, было бы лучше использовать полиморфизм, чтобы он стал обслуживаемым.