我以前从未使用过工厂,原因很简单,我不知道什么时候需要它们。我在业余时间一直在做一个小游戏,我决定为声音实现FMOD。我看了一个为OpenAL设计的包装器(不同的声音设置),它看起来像......
SoundObject * SoundObjectManager * SoundObjectFactory *
SoundObject基本上是每个声音对象的实例。 SoundObjectManager只管理所有这些对象。这是很直接的,并且很有意义,但我没有得到工厂正在做什么或使用什么。我一直在阅读关于Factorys的内容,但仍然没有真正得到它们。
任何帮助将不胜感激!
答案 0 :(得分:2)
将Factory视为“虚拟构造函数”。它允许您使用通用编译时类型但不同的运行时类型构造对象。您可以通过告诉Factory创建不同运行时类型的实例来切换行为。
答案 1 :(得分:1)
在实施需要参数化时使用工厂。 FMOD是跨平台的,它需要决定为您的平台提供哪些具体实现。这就是工厂正在做的事情。有两种主要模式Abstract Factory Pattern和Factory Method Pattern。
答案 2 :(得分:1)
假设情况:我正在编写一个我想在多个平台上运行的声音库。我将尝试尽可能多地使代码与平台无关,但肯定有些代码需要针对Windows而不是Linux进行更改。
所以我编写了所有这些不同的实现,但我不希望最终用户必须使他们的程序依赖于Linux或Windows或其他任何东西。我也不想为我的API维护4个不同的接口。 (注意这些只是您可能创建工厂的一些原因 - 当然还有其他情况)。
所以我定义了这个很好的通用SoundObject
基类,它定义了客户端使用的所有方法。然后我创建LinuxSoundObject
,WindowsSoundObject
,其他5个来自SoundObject
。但是我将隐藏用户的所有这些具体实现,并仅向他们提供SoundObject
。相反,你必须调用我的SoundObjectFactory
来抓住你认为是普通老SoundObject
的东西,但实际上我已经为你选择了正确的运行时类型并自己实例化了。
2年后,一个新的操作系统出现并取代了Windows。我只是更新我的库以支持新平台而不是强迫您重写软件,而且您永远不会看到对界面的更改。
这都是非常人为的,但希望你能得到这个想法。
工厂将接口的使用者与实际使用的运行时类型(即实现)隔离开来。
答案 3 :(得分:0)
工厂可用于实现控制反转,并将实例化代码(“新”)与组件逻辑分开。这在您编写单元测试时很有用,因为您可能不希望测试对象创建一堆其他对象。