Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 了解工厂,我应该使用它们吗?_C++_Design Patterns_Factories - Fatal编程技术网

C++ 了解工厂,我应该使用它们吗?

C++ 了解工厂,我应该使用它们吗?,c++,design-patterns,factories,C++,Design Patterns,Factories,我以前从未使用过工厂,原因很简单,我不知道什么时候需要它们。我一直在工作的一个小游戏在我的业余时间,我决定实施FMOD的声音。我看了一个为OpenAL(不同的声音设置)设计的包装,它看起来像 声音物体* SoundObjectManager* SoundObjectFactory* SoundObject基本上是每个声音对象的实例。SoundObjectManager只管理所有这些对象。这很直截了当,也很有道理,但我不明白工厂在做什么,也不知道它在用什么。我一直在阅读工厂的资料,但还是没有真正了

我以前从未使用过工厂,原因很简单,我不知道什么时候需要它们。我一直在工作的一个小游戏在我的业余时间,我决定实施FMOD的声音。我看了一个为OpenAL(不同的声音设置)设计的包装,它看起来像

声音物体* SoundObjectManager* SoundObjectFactory*

SoundObject基本上是每个声音对象的实例。SoundObjectManager只管理所有这些对象。这很直截了当,也很有道理,但我不明白工厂在做什么,也不知道它在用什么。我一直在阅读工厂的资料,但还是没有真正了解它们


任何帮助都将不胜感激

将工厂视为一个“虚拟构造函数”。它允许您构造具有常见编译时类型但不同运行时类型的对象。只需告诉工厂创建不同运行时类型的实例,即可切换行为。

当需要参数化实现时,使用工厂。FMOD是跨平台的,它需要决定为您的平台提供什么具体实现。这就是工厂正在做的事情。有两种主要模式和假设情况:我正在编写一个声音库,希望在多个平台上运行。我将尽可能多地使代码独立于平台,但对于Windows、OSX和Linux,其中一些代码肯定需要更改

所以我写了所有这些不同的实现,但我不希望最终用户不得不让他们的程序依赖于Linux或Windows或其他任何东西。我也不想为我的API维护4个不同的接口。(请注意,这些只是创建工厂的一些原因——当然还有其他情况)

所以我定义了这个很好的泛型
SoundObject
基类,它定义了客户端使用的所有方法。然后我将我的
LinuxSoundObject
WindowsSoundObject
,以及其他5个源于
SoundObject
。但是我将对用户隐藏所有这些具体的实现,并且只向他们提供一个
SoundObject
。相反,您必须调用我的
SoundObjectFactory
,以获取您认为是普通的
SoundObject
,但实际上我为您选择了正确的运行时类型,并亲自实例化了它

2年后,一个新的操作系统出现并取代了Windows。我没有强迫你重写你的软件,我只是更新我的库来支持新的平台,你永远看不到界面的变化

这一切都很做作,但希望你能理解


工厂将接口的使用者与实际使用的运行时类型(即实现)隔离开来。

工厂可用于实现控制反转,并将实例化代码(新代码)与组件逻辑分离。这在编写单元测试时很有帮助,因为您可能不希望被测试对象创建一堆其他对象。

所以对于这样的东西,真的不需要它吗?考虑到我将一直只使用SoundObject*的实例和管理器的单个实例。如果没有不同的SoundObject子类型,我会说“不”。实际上,使用该模式的目的是将对象的创建与使用隔离开来。这允许在不更改使用基类的代码的情况下引入新的派生类型。您可能有SoundObject的子类型,但您不知道,工厂将您与这些实现细节隔离。这是我正在查看的项目中的代码(非常简单和小)。他在createInstanceImpl中返回一个函数,返回值为OgreOggISound*(这是sound的一个实例)但是函数的返回类型是MovableObject*那么它到底是如何工作的呢?它只是把它投射到一个可移动的物体上吗?谢谢你的帮助:这是完全正确的,你应该看C++的傻瓜书。至于那个链接,尽管我在上面的评论中发表,我仍然不确定他在做什么,但是看起来他利用工厂把它变成一个可移动的对象,但我真的不明白。因为这只是一个学习项目,我现在不想去,我想我知道将来我什么时候需要使用它。这不是C++特定的,它是所有OO语言(和一些非OO)的通用设计模式。