猿问

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

我有一组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,但是这个工厂似乎与构建器模式混合在一起!那么这是一个好的解决方案吗?或者这个解决方案有更好的选择吗?


catspeake
浏览 140回答 1
1回答

有只小跳蛙

您决定使用 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();和我一样,带参数的构造函数更可取,因为它可以防止您丢失一个或多个内部字段。
随时随地看视频慕课网APP

相关分类

Java
我要回答