从工厂返回静态或动态分配的对象

Return a statically or dynamically allocated object from a factory?

本文关键字:动态分配 对象 静态 工厂 返回      更新时间:2023-10-16

基本上,这是:

Cat CatFactory::CreateCat()
{
    return Cat();
}

或者这个:

Cat* CatFactory::CreateCat()
{
    return new Cat();
}

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

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

我看到的所有例子都倾向于使用新的关键字。为什么会出现这种情况?

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

Cat *make_cat(int type)
{
    switch (type) {
        case TABBY:
            return new Tabby();
        case TORTOISESHELL:
            return new Tortoiseshell();
        // etc.
    }
};

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

按值返回的其他原因包括不可复制的对象。如果您不喜欢使用原始指针,并且现代C++风格有它,那么请返回unique_ptrshared_ptr

这一切都取决于你在应用程序上下文中所说的"对象"(在抽象意义上)是什么意思,你如何识别它,以及多态性必须尊重它的作用。

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

如果您通过对象在内存中的位置(也称为地址)来识别对象,则必须传递指针或引用,这样就不会进行复制。在这种情况下,两个都包含"abc"的不同变量被认为是"代表不同的东西,顺便说一句,看起来是一样的"。

如果需要多态性,那么必须通过指针传递(或通过引用传递,但不是通过值传递),因为C++多态性是通过间接方式操作的。

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

这里的要点是,"工厂模式"是一种面向对象的技术,在面向对象的世界之外并不那么有趣。