1

在此处输入图像描述

在这张图片中,您可以看到源类中的一些常量,它们帮助工厂生成正确的对象。有人告诉我这是一种反模式,我应该将这些常量移到另一个类。我应该把他们搬到工厂班吗?

这是工厂类的代码:

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

2 回答 2

2

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

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

于 2013-02-08T23:49:17.427 回答
1

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

另一种可能性是工厂方法。如果您对自己的班级是否值得 Builder 感到不安,这可能是一个很好的匹配。

于 2013-02-09T05:29:17.033 回答