Как решить дилемму, когда фабрике нужно создавать объекты с несколькими общими параметрами?
У меня есть набор подклассов 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();
Как и для меня, конструктор с параметрами предпочтительнее, потому что он предотвращает пропуск одного или нескольких внутренних полей.