Как решить дилемму, когда фабрике нужно создавать объекты с несколькими общими параметрами?

У меня есть набор подклассов PageRenderer абстрактный класс, например

  • ImagePageRenderer
  • TextPageRenderer
  • VideoPageRenderer,

Таким образом, чтобы получить PageRenderer Например, фабричный метод подходит. concreate Фабрика выглядит так:

public class PageRendererFactory extends AbstractFactory {
  PageRenderer createPageRenderer(Type type) {
    //implementation
  }
}//Code AbstractFactory is skipped here

Однако проблема в том, что PageRenderer содержит несколько переменных экземпляра для использования подклассами:

public abstract class PageRenderer {
  protected A a;
  protected B b;
  protected C c;
  protected D d;
  Protected E e;
  //there might be even more instance variables
}

и все подклассы PageRenderer поделиться этими переменными экземпляра.

В соответствии с условиями выше, я бы изменил PageRendererFactory так что он содержит упомянутые переменные экземпляра:

public class PageRendererFactory extends AbstractFactory {
  private A a;
  private B b;
  private C c;
  private D d;
  Private E e;
  //there might be even more instance variables here
  PageRenderer createPageRenderer(Type type) {
    //use the instance variables to instantiate the subclass of PageRenderer according to the Type
  }
}//Code AbstractFactory is skipped here

Вопрос: В этом случае мне, вероятно, понадобятся сеттеры на этом PageRendererFactory Но тогда эта фабрика, кажется, смешалась с моделью строителя! Так это хорошее решение? или есть ли лучшая альтернатива для этого решения?

1 ответ

Решение

Вы решили использовать Factory правильно.

И неважно, как будет создана эта Фабрика.

Прямым звонком

Factory factory = new Factory();

По прямому звонку с сеттерами

Factory factory = new Factory();
factory.setA(a);
...
factory.setE(e);

По вызову с параметрами

Factory factory = new Factory(a, b, c, d, e);

Или через строителя

Factory factory = new Factory.Builder()
    .withA(a)
    ...
    .withE(e)
    .build();

Как и для меня, конструктор с параметрами предпочтительнее, потому что он предотвращает пропуск одного или нескольких внутренних полей.

Другие вопросы по тегам