Несколько параметров в шаблоне фабричного метода

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

public class ObjectFactory{

    public static IObject createObject(Param1 p1, Param2 p2, Param3 p3){
        if (p1.getName('name1')){
            return new Object1(p1,p2,p3);
        }else{
            return new Object2(p1, p2);
        }
    }
}

public interface IObject{   
    void doSomething();
}

public class Object1 implements IObject {
    public Object1(Param1 p1, Param2 p2, Param3 p3){}
}

public class Object2 implements IObject {
    public Object1(Param1 p1, Param2 p2){}
}

Я немного запутался с Param3 в методе createObject ObjectFactory. У меня всегда есть этот параметр, но иногда это не имеет смысла. Мне это не нравится, потому что, если когда-нибудь я добавлю больше объектов с другими параметрами, мне нужно будет добавить слишком много параметров в сигнатуру метода.

Я думал об определении: общедоступный статический IObject createObject (Param1 p1, Param2 p2, Param3 p3) общедоступный статический IObject createObject (Param1 p1, Param2 p2), но тогда это не шаблон фабричного метода, потому что вызывающий должен знать, какой метод должен быть казненным.

Знаете ли вы какое-либо решение, чтобы справиться с этим?

Заранее спасибо.


person javer    schedule 03.11.2016    source источник
comment
Взгляните на шаблон Builder: en.wikipedia.org/wiki/Builder_pattern   -  person Michael Markidis    schedule 03.11.2016


Ответы (1)


Вы уверены, что фабрика действительно упрощает конструкцию? Ваш пример использования очень абстрактен, поэтому трудно сказать, но если клиент уже должен явно знать различные зависимости, возможно, вам также следует позволить ему выбрать реализацию?

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

Однако может также случиться так, что клиент знает конфигурацию, но не знает и не должен знать, как это преобразуется в реализацию. В этом случае использование шаблона Builder может упростить ваш API, если у вас много перестановок параметров конфигурации.

person plalx    schedule 03.11.2016