Java 当工厂需要创建具有多个公共参数的对象时,如何解决这个难题?

Java 当工厂需要创建具有多个公共参数的对象时,如何解决这个难题?,java,factory-pattern,builder-pattern,Java,Factory Pattern,Builder Pattern,我有一组PageRenderer抽象类的子类,例如 ImagePageRenderer TextPageRenderer VideoPageRenderer 因此,为了获得PageRenderer实例,工厂方法是合适的。concreate工厂如下所示: public class PageRendererFactory extends AbstractFactory { PageRenderer createPageRenderer(Type type) { //implement

我有一组
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
的所有子类都共享这些实例变量

根据上述条件,我将更改
PageRenderFactory
,使其包含上述实例变量:


问题:在这种情况下,我可能需要在这个
页面渲染器工厂
上使用setter,但是这个工厂似乎混合了构建器模式!那么这是一个好的解决方案吗?或者该解决方案有更好的替代方案吗?
您使用Factory的决定是正确的。

这家工厂将如何创建并不重要

直拨

Factory factory = new Factory();
通过直接调用setter

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

像我一样,带参数的构造函数更可取,因为它可以防止您丢失一个或多个内部字段。

谁说不能将生成器模式与factory模式一起使用?没有人说:D,但它看起来有点奇怪,我看不出有任何理由不这样做,所以创建一个生成器吧!什么意思?我不明白你的意思
Factory factory = new Factory.Builder()
    .withA(a)
    ...
    .withE(e)
    .build();