当工厂需要创建具有多个公共参数的对象时,如何解决困境?
How to resolve the dilemma when a factory needs to create objects with multiple common parameters?
我有一组 PageRenderer
摘要 class 的子class,例如
ImagePageRenderer
TextPageRenderer
VideoPageRenderer
。
所以为了得到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();
像我一样,带参数的构造函数更可取,因为它可以防止您丢失一个或多个内部字段。
我有一组 PageRenderer
摘要 class 的子class,例如
ImagePageRenderer
TextPageRenderer
VideoPageRenderer
。
所以为了得到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();
像我一样,带参数的构造函数更可取,因为它可以防止您丢失一个或多个内部字段。