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

У меня есть набор подклассов 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 Ответ

0 голосов
/ 03 февраля 2019

Вы решили использовать Фабрику правильно.

И не имеет значения, как будет создана эта Фабрика.

По прямому вызову

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();

Как и у меня, конструктор сПараметры предпочтительнее, поскольку они не позволяют пропустить одно или несколько внутренних полей.

...