相关疑难解决方法(0)

单身人士有什么不好的?

单例模式是一个缴足成员四人帮模式书,但最近似乎而是由开发者世界孤立.我仍然使用相当多的单例,特别是对于工厂类,虽然你必须对多线程问题(实际上是任何类)有点小心,但我不明白为什么它们如此可怕.

Stack Overflow特别假设每个人都同意Singletons是邪恶的.为什么?

请用" 事实,参考或特定专业知识 " 支持您的答案

singleton design-patterns

1931
推荐指数
30
解决办法
48万
查看次数

GOF Singleton模式有没有可行的替代方案?

面对现实吧.Singleton模式是高度争议与成群程序员话题围栏边.有些人认为,辛格尔顿只不过是一个美化的全球变量,而其他人则以模式发誓并不断使用它.但是,我不希望单身人士的争议成为我问题的核心. 每个人都可以进行一场拔河比赛并与之抗争,看看谁能为我所关心的所有人赢得胜利.我想说的是,我不相信有一个正确的答案,我不是故意尝试激烈的党派争吵.当我问这个问题时,我只对单身替代品感兴趣:

他们是GOF Singleton模式的任何特定替代品吗?

例如,很多次我在过去使用单例模式时,我只想保留一个或多个变量的状态/值.但是,变量的状态/值可以使用静态变量而不是使用单例模式在类的每个实例化之间保留.

还有什么其他的想法?

编辑: 我真的不希望这是另一篇关于"如何正确使用单身人士"的帖子.再一次,我正在寻找避免它的方法.为了好玩,好吗?我想我在你最好的电影预告片中问一个纯粹的学术问题,"在一个没有单身的平行宇宙中,我们能做什么?"

singleton design-patterns

89
推荐指数
6
解决办法
2万
查看次数

好吧,全局变量被谴责,单身人士被鄙视,还有什么选择?

对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.

singleton global-variables

36
推荐指数
4
解决办法
2万
查看次数

C++摆脱了Singletons:替代了仿函数和静态方法

我的崇高任务是摆脱单身人士和静态阶级.

背景:
我有以下结构:

  • Cmd
    经常实例化对象,它拥有命令(string)的名称,以及任何类的静态方法作为指针的仿函数.
    它通常在诸如Input,Console,Render等主类中创建,并且引用类中创建它的方法,为这些方法提供运行时语言接口.
    Cmds还以字符串数组的形式解释参数,其中第一个参数是Cmd的名称,所有连续字符串是被调用的静态方法的直接参数.参数count和argument数组存储在Commander中,并在每次Cmd调用之前更改.
  • Commander
    Commander用于解释字符串命令(可以直接或通过控制台),它执行Cmd,它作为字符串存储在缓冲区中(通过调用它的仿函数).

问题:
问题是我试图摆脱所有的静态类(我现在变成了用于测试的单例),并且我使系统完全模块化并且松散耦合.这反过来阻止我进行Cmds可能指向的静态调用.

第一直觉是将函数从typedef更改为模板类,这将存储一个对象和方法,但它看起来非常混乱和复杂,我个人不舒服:

Cmd::create("toggleconsole", Console::toggle);
Run Code Online (Sandbox Code Playgroud)

至:

Cmd::create("toggleconsole", new FunctorObject<Console>(&Console::get(), &Console::toggle));
Run Code Online (Sandbox Code Playgroud)

最终的Cmd创建看起来非常模糊和误导谁负责Functor解除分配.

我也正在将Cmd创建从静态方法调用移动到Commander类中,所以它看起来像commander.createCmd("command_name",...); 而不是Cmd :: create("command_name",...); 这是因为Commander不再是静态的(或单例),因此它处理的所有命令都必须属于它.

但是,我完全不知道我的选项/替代方案是注册Cmds,并通过允许向Commander发出字符串命令来维持松散耦合.

我已经考虑过让每个主类派生自一个CmdListener类,它会在创建时用Commander注册该对象,然后在执行期间将命令传递给覆盖"onCmd(const Cmd&command)"的所有已注册对象.

这也留下了一些未解答的问题:Cmd将如何调用应该调用哪个类的方法?保持指针是没有意义的,并且会受到高度默默无闻的影响(如上所示).另外,我希望不为每个可以处理该cmd的类重新解释onCmd方法中的字符串.

这是很多信息,但有没有人对如何处理这个问题有任何想法?

此外,我的所有类都必须知道Commander和Console对象,它们不再是单例/静态.到目前为止,我已将它们放在Context对象中,并将它像一个小胶囊一样传递.关于如何解决这些后单例残留问题的任何想法?

这个项目是我个人的工作,我打算在我的简历上使用它 - 因此,我不希望我的潜在雇主看到任何单身人士(我也不想解释为什么,因为我可以证明他们自己并非真正必要).

万分感谢!

编辑:排版.

c++ singleton structure functor

4
推荐指数
1
解决办法
1224
查看次数