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?
因为工厂模式通常用于避免泄漏构造函数和类层次结构的知识(许多系统中的实现细节!)如果要返回
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的程序倾向于遵循第二种模式。功能或通用程序往往遵循第一个。
这里的要点是,"工厂模式"是一种面向对象编程技术,在面向对象编程领域之外没有那么有趣。