5

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

SoundObject* SoundObjectManager* SoundObjectFactory*

SoundObject 基本上是每个声音对象的实例。SoundObjectManager 只管理所有这些对象。这很简单,也很有意义,但我不明白工厂在做什么或使用什么。我一直在阅读有关工厂的信息,但仍然没有真正理解它们。

任何帮助,将不胜感激!

4

4 回答 4

2

将 Factory 视为“虚拟构造函数”。它允许您构造具有通用编译时类型但运行时类型不同的对象。您可以简单地通过告诉工厂创建不同运行时类型的实例来切换行为。

于 2010-02-11T23:26:20.323 回答
1

当需要对实现进行参数化时使用工厂。FMOD 是跨平台的,它需要决定为您的平台提供什么具体实现。这就是工厂正在做的事情。有两种主要的模式抽象工厂模式工厂方法模式

于 2010-02-11T23:27:54.873 回答
1

假设情况:我正在编写一个我想在多个平台上运行的声音库。我将尝试使尽可能多的代码独立于平台,但肯定需要针对 Windows、OSX 和 Linux 进行更改。

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

所以我定义了这个很好的通用SoundObject基类,它定义了客户端可以使用的所有方法。然后我让我LinuxSoundObjectWindowsSoundObject, 和其他 5 个从SoundObject. 但我将对用户隐藏所有这些具体的实现,只为他们提供一个SoundObject. 相反,您必须调用 mySoundObjectFactory来获取在您看来是普通的 old SoundObject,但实际上我已经为您选择了正确的运行时类型并自己实例化了它。

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

这一切都很做作,但希望你能明白。

Factories isolate consumers of an interface from what runtime type (i.e. implementation) is really being used.

于 2010-02-11T23:37:38.093 回答
0

Factories can be used to implement inversion of control, and to separate instantiation code (the 'new's) from the logic of your components. This is helpful when you're writing unit tests since you may not want tested objects to create a bunch of other objects.

于 2010-02-11T23:39:27.060 回答