我有一组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
制定者,但后来这家工厂似乎与建筑商模式混合!所以这是一个很好的解决方案?或者是有这个解决方案更好的选择吗?
您可以使用工厂的决定是正确的。
有没有问题,这家工厂将如何被创建。
通过直接调用
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();
像我,构造函数的参数是可取的,因为它可以防止您错过一个或多个内部字段。