在此图像上,您会看到源类中的一些常量,它们可帮助工厂制作正确的对象。我被告知这是一个反模式,我应该把这些常量移到另一个类。我应该把他们搬到工厂吗?
以下是Factory类的代码:
class Factory
{
public function make($format)
{
switch ($format)
{
case Source::Assocs:
return new SourceFormatsAssocs();
case Source::XML:
return new SourceFormatsXML();
//Some more formats
}
}
}
答案 0 :(得分:2)
这确实可以防止在不修改基类的情况下添加新子类(添加新常量)。我确实会把它搬到工厂。工厂必须知道它可以创建的所有类型的子类。基类不需要知道它的子类。
此外,这些常量仅供工厂(以及工厂的来电者)使用。基类根本不使用它们。
答案 1 :(得分:1)
更好的想法是考虑建造者。为什么?因为你可以有一个知道Formats类型的抽象类,然后是构造各种子类型的具体构造函数。请注意,当构造涉及通过多个步骤制作复杂的东西时,构建器应该完成,但是构建器模式的变体,如Bloch中的静态构建器和流畅的构建器,您使用模式将调用链接到使代码更具可读性,并且产品是内联生成的。
另一种可能性是Factory Method。如果你对你的班级是否值得建造者感到不安,这可能是一个很好的匹配。