创建条件应在哪里以工厂模式迁移?

时间:2013-02-08 23:39:01

标签: design-patterns factory

enter image description here

在此图像上,您会看到源类中的一些常量,它们可帮助工厂制作正确的对象。我被告知这是一个反模式,我应该把这些常量移到另一个类。我应该把他们搬到工厂吗?

以下是Factory类的代码:

class Factory
{
        public function make($format)
        {
                switch ($format)
                {
                        case Source::Assocs:
                                return new SourceFormatsAssocs();
                        case Source::XML:
                                return new SourceFormatsXML();
                        //Some more formats
                }
        }
}

2 个答案:

答案 0 :(得分:2)

这确实可以防止在不修改基类的情况下添加新子类(添加新常量)。我确实会把它搬到工厂。工厂必须知道它可以创建的所有类型的子类。基类不需要知道它的子类。

此外,这些常量仅供工厂(以及工厂的来电者)使用。基类根本不使用它们。

答案 1 :(得分:1)

更好的想法是考虑建造者。为什么?因为你可以有一个知道Formats类型的抽象类,然后是构造各种子类型的具体构造函数。请注意,当构造涉及通过多个步骤制作复杂的东西时,构建器应该完成,但是构建器模式的变体,如Bloch中的静态构建器和流畅的构建器,您使用模式将调用链接到使代码更具可读性,并且产品是内联生成的。

另一种可能性是Factory Method。如果你对你的班级是否值得建造者感到不安,这可能是一个很好的匹配。