假设情况:我正在编写一个我想在多个平台上运行的声音库。我将尝试使尽可能多的代码独立于平台,但肯定需要针对 Windows、OSX 和 Linux 进行更改。
所以我编写了所有这些不同的实现,但我不希望最终用户不得不让他们的程序依赖于 Linux 或 Windows 或其他任何东西。我也不想为我的 API 维护 4 个不同的接口。(请注意,这些只是您可能创建工厂的一些原因——当然还有其他情况)。
所以我定义了这个很好的通用SoundObject
基类,它定义了客户端可以使用的所有方法。然后我让我LinuxSoundObject
的WindowsSoundObject
, 和其他 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.