关于c ++:从工厂返回静态或动态分配的对象?

Return a statically or dynamically allocated object from a factory?

本问题已经有最佳答案,请猛点这里访问。

基本上,这是:

1
2
3
4
Cat CatFactory::CreateCat()
{
    return Cat();
}

或者:

1
2
3
4
Cat* CatFactory::CreateCat()
{
    return new Cat();
}

我知道一般的建议是尽可能避免新建,并且倾向于在堆栈上创建对象,这样就不必使用delete。这也适用于工厂吗?我看到的所有示例都倾向于使用新的关键字。为什么会这样?

我不能使用智能指针,因为这是一个类项目,每个人对C++都是新的,我们必须在以后整合我们的项目。


All the examples I see tend to use the new keyword. Why is this the case?

因为工厂模式通常用于避免泄漏构造函数和类层次结构的知识(许多系统中的实现细节!)如果要返回Cat而不是Cat的子类的实例,则需要使用它:

1
2
3
4
5
6
7
8
9
10
Cat *make_cat(int type)
{
    switch (type) {
        case TABBY:
            return new Tabby();
        case TORTOISESHELL:
            return new Tortoiseshell();
        // etc.
    }
};

如果按值返回,则无法执行此操作。

按值返回的其他原因包括不可复制的对象。如果你不喜欢使用原始指针,而现代C++风格有它,你应该返回一个EDCOX1 2或3。


这完全取决于您在应用程序上下文中所说的"对象"(在abstract意义上)是什么意思,以及您如何识别它,以及多态性必须对它起的作用。

如果你的对象不需要是多态的,你可以通过值来识别它们,你可以通过值传递它们(或者在C++ 11中移动它们),事实上,你可以使用一个"价值语义"。在这种情况下,包含"abc"的两个变量是"相等的",并且被认为在不同的地方(范围)表示"相同的东西"。

如果通过对象在内存中的位置(也就是地址)来标识对象,那么就不需要传递指针或引用,这样就不会进行复制。在这种情况下,两个包含"abc"的不同变量被认为是"代表不同的事物,顺便说一下,它们看起来是相同的"。

如果需要多态性,那么通过指针(或者通过引用,而不是按值)是必须的,因为C++的多态性是通过间接操作来实现的。

基于OOP的程序倾向于遵循第二种模式。功能或通用程序往往遵循第一个。

这里的要点是,"工厂模式"是一种面向对象编程技术,在面向对象编程领域之外没有那么有趣。