在进行OOP状态机设计时如何避免单例?

MrK*_*ish 8 c++ oop singleton fsm

我正在努力教自己编程.我开始的方式与我相信大多数人的开始方式相同; 制作小而凌乱的应用程序和游戏,以不那么简单的方式做简单的事情.最近,我一直试图通过编写一个使用OOP设计的更复杂的游戏来编写更好,更模块化的代码来迈出下一步!

我遇到的主要问题是我的主要StateManager(FSM)类的设计(在介绍/菜单/游戏/等屏幕状态之间切换).我看起来又高又低,我真的只看到了两种设计方法:

  • 使用switch/case语句+枚举来切换状态.

  • 创建一个单独的FSM类,用于处理向量/从向量中推送/弹出状态.

现在,我的问题是,switch case语句是非常重复和笨重的,它有点违背我使用这个项目来教自己OOP的目标.

我的第二个也是更大的问题是"单身人士"的建议.

正如我之前所说,我正在努力自学,在编程时我还有很多需要学习的东西,特别是在OOP和设计模式以及所有这些方面.我遇到了一个问题,对于我发现的每一个单身"单身都是邪恶的"线索和讨论,我发现很多教程和参考,其中人们在他们的代码中使用单例来制作'引擎'类和FSM.这是一个非常一致的混合信息.

我想我只是不明白为什么......即使你只想要/打算拥有一个类的单个对象,为什么使构造函数私有并创建一个单例是必要/有益的?我已经阅读了很多关于单身人士是如何坏,他们如何基本上是全球性的,他们如何妨碍多线程,以及有多少程序员认为他们过度使用或只是简单的糟糕设计......但我看到例子后面的例子人们使用它们,很少有反例显示替代方法.

只用常规课可以做同样的事吗?明确限制实例创建的目的是什么?我只听过关于单身人士的消极事情,但人们似乎经常使用它们......我完全错过了关于单身人士和OOP的事情吗?

单身人士的使用只是一种趋势,还是只是人们称单身人士为"邪恶"的趋势?我该怎么解决这个问题?开关/外壳FSM和单独FSM之间没有什么东西?有没有人能够以完全相同的方式设计他们的程序的状态系统,而不需要他们的任何课程单身人士?这会改变什么吗?[ confused ]

R. *_*des 6

只用常规课可以做同样的事吗?明确限制实例创建的目的是什么?我只听过关于单身人士的消极事情,但人们似乎经常使用它们......我完全错过了关于单身人士和OOP的事情吗?

不,我相信你走在正确的轨道上:绝对没有理由阻止创建两个实例.宇宙不会因此而崩溃.

这是一个完全不必要的限制.因为你必须手动编写这个限制,所以完全拥有它是非常愚蠢的(如果你必须编写代码来解除它,那将是另一回事).

我想可能有一些奇怪而罕见的情况,如果第二个实例被创建,宇宙会崩溃,但这听起来很牵强.无论如何,它并不能证明整个互联网上单身人士的普遍存在.

我无法解释为什么人们不经常使用它们而不侮辱那些人的推理能力,所以我不会这样做.

有没有人能够以完全相同的方式设计他们的程序的状态系统,而不需要他们的任何课程单身人士?这会改变什么吗?

它唯一改变的是,通过使它成为单身,你可以防止自己为单元测试创​​建一次性实例.其他一切都是一样的.

  • @MrKatSwordfish:Filesystem; 这通常是典型的例子.但一般来说,当你看到有人暗示某事是一个单身人士时,问问自己,"为什么一个人*需要*来阻止某人实例化第二个?" 大多数时候,"单身人士"与"全球可用的实例"相混淆. (4认同)