【问题标题】:Factory object vs factory function工厂对象与工厂函数
【发布时间】:2009-02-11 11:58:30
【问题描述】:

我有一个带有几个派生类的 ABC。为了创建这些派生类,我使用工厂模式:

.h 文件:

class derivedFactory
{
public:
    base* createInstance();
};

.cpp 文件:

base* derivedFactory::createInstance()
{
    return new derived();
}

这比仅仅拥有一个免费功能有什么好处:

.h 文件:

base* derivedFactoryFunction();

.cpp 文件:

base* derivedFactoryFunction()
{
    return new derived();
}

另外:我使用抽象工厂模式进行依赖注入。我可能会使用基于 ABC 的继承层次结构:

class objectCreator
{
public:
    base* create() = 0;
};

在函数指针上使用 this 有什么好处:

boost::function<base* ()> factory_ptr;

使用 boost::bind/lambda 这似乎使我的代码更具可组合性,如果我希望我可以在其中包装一个真正的工厂对象。我可以看到性能可能会略有下降,但这很值得担心,因为它只在启动期间调用。

【问题讨论】:

    标签: c++ design-patterns factory


    【解决方案1】:

    这取决于您的工厂需要有多灵活。如果工厂需要外部信息(例如来自配置文件、程序选项等)来确定如何构造对象,那么对象是有意义的。如果您需要的只是工厂的参数,那么函数可能就可以了。

    我认为拥有指针的唯一好处是用于测试,您可以在其中使用不同的工厂函数。

    【讨论】:

    • 指针将允许实现抽象工厂模式。我已经在上面展开了
    【解决方案2】:

    具有单个方法的接口或指向方法的指针是等效的。

    但在第二种情况下,如果您希望另一种方法与第一种方法一起使用,您会遇到麻烦......

    在我看来,接口比方法指针更具可读性。

    那你选择了。

    【讨论】:

      【解决方案3】:

      我想说,将工厂函数作为类本身的静态方法的优势在于,它显然是该类生命周期的一部分。将其分开意味着使用您的类的其他程序员将不得不在其他地方寻找工厂方法。

      很抱歉,我不确定您将函数指针传递给因子方法的确切含义,但如果您不需要,我通常不会使用函数指针。函数指针不能内联,因为它们无法在编译时解析,这意味着它们可能会更慢。但除此之外,如果您已经可以确定要在编译时调用哪个函数,那么使用函数指针似乎是一种糟糕的设计。

      【讨论】:

        【解决方案4】:

        您是否曾经想要一个类型的多个工厂?如果是这样,您需要工厂对象。

        【讨论】:

          猜你喜欢
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-11
          相关资源
          最近更新 更多