如何解决时,工厂需要创建具有多个常用的参数对象的窘境?

问题描述 投票:2回答:1

我有一组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制定者,但后来这家工厂似乎与建筑商模式混合!所以这是一个很好的解决方案?或者是有这个解决方案更好的选择吗?

java factory-pattern builder-pattern
1个回答
1
投票

您可以使用工厂的决定是正确的。

有没有问题,这家工厂将如何被创建。

通过直接调用

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

像我,构造函数的参数是可取的,因为它可以防止您错过一个或多个内部字段。

© www.soinside.com 2019 - 2024. All rights reserved.