使用单例类进行声音管理有什么优缺点?
我担心它在结构上非常反OOP,并且不希望潜在地陷入错误的道路,但是什么是更好的选择呢?
答案 0 :(得分:1)
这是一个尴尬的话题,但我会说一个声音管理器样式类是一个不应该初始化的类的好候选者。
同样,如果键盘输入管理器样式类是一个完全静态的类,我会觉得没问题。
我的推理有些注意事项:
反正;这是我的观点,以抵消将出现在这里的可能相反的答案。
答案 1 :(得分:0)
它们很糟糕,因为全局变量很糟糕的原因相同,一些有用的读物:
http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx
更好的选择是将它作为应用程序类的成员,并将其引用仅传递给需要处理声音的模块。
答案 2 :(得分:0)
“经理”通常是非常复杂的类,因此可能违反Single Responsibility Principle。用鲍勃·马丁叔叔的话来解释:任何时候你都觉得自己想要把某个东西称为“经理” - 这就是代码味道。
在您的情况下,您至少要处理三种不同的职责:
其中两个可能被实现为单例,但是你应该总是非常小心这个模式,因为in itself, it violates the SRP,如果使用错误的方式,它会导致你的代码紧密耦合(相反,你应该使用Dependency Injection模式,可能通过框架,例如SwiftSuspenders,但not necessarily):
SoundModel
处理,每个应用程序只需要一个实例。 SoundController
处理全局设置,并且几个孩子SoundControllers
负责更具体的上下文,例如UI声音效果,游戏声音,音乐,等。 播放声音会在很多地方发生,并且会以多种不同的方式发生:可能存在循环(您需要保留引用以便以后能够停止它们),或效果声音(通常很短并且只播放一次)或音乐(每首歌曲通常播放一次,但需要后续歌曲自动启动,到达目的地时)。对于每个变体(以及您提出的任何变体),您应该创建一个不同的类,它实现了一个通用的SoundPlayer
接口,例如: LoopSoundPlayerImpl
,SequentialSoundPlayerImpl
,EFXSoundPlayerImpl
等。界面应该像play()
,pause()
,rewind()
一样简单 - 您可以轻松地更换这些界面以后,紧密耦合的库不会有任何问题。
每个SoundPlayer
都可以同时包含主SoundController
及其内容特定的引用,以及 - { - 1}}。 这些,然后可以是静态引用:因为它们都是你自己的声音插件的所有部分,它们通常会被部署为一个包,因此紧耦合不会这里有很多损害 - 但重要的是,不要越过插件的边界:实例化SoundModel
分区中的所有内容,并将实例传递给所有需要它们的类;只有Main
界面显示在您的游戏逻辑等中