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

How to resolve the dilemma when a factory needs to create objects with multiple common parameters?

我有一组 PageRenderer 摘要 class 的子class,例如

所以为了得到PageRenderer实例,工厂方法是合适的。 concreate 工厂看起来像这样:

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

但是,问题是 PageRenderer 包含几个供子class 使用的实例变量:

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 的所有子classes 共享这些实例变量。

根据上述条件,我将更改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 的 setter,但是这个工厂似乎与 builder 模式混合 !那么这是一个好的解决方案吗?或者这个解决方案有更好的选择吗?

您使用 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();

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