面对现实吧.Singleton模式是高度争议与成群程序员话题都围栏边.有些人认为,辛格尔顿只不过是一个美化的全球变量,而其他人则以模式发誓并不断使用它.但是,我不希望单身人士的争议成为我问题的核心. 每个人都可以进行一场拔河比赛并与之抗争,看看谁能为我所关心的所有人赢得胜利.我想说的是,我不相信有一个正确的答案,我不是故意尝试激烈的党派争吵.当我问这个问题时,我只对单身替代品感兴趣:
他们是GOF Singleton模式的任何特定替代品吗?
例如,很多次我在过去使用单例模式时,我只想保留一个或多个变量的状态/值.但是,变量的状态/值可以使用静态变量而不是使用单例模式在类的每个实例化之间保留.
还有什么其他的想法?
编辑: 我真的不希望这是另一篇关于"如何正确使用单身人士"的帖子.再一次,我正在寻找避免它的方法.为了好玩,好吗?我想我在你最好的电影预告片中问一个纯粹的学术问题,"在一个没有单身的平行宇宙中,我们能做什么?"
对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.
我的崇高任务是摆脱单身人士和静态阶级.
背景:
我有以下结构:
问题:
问题是我试图摆脱所有的静态类(我现在变成了用于测试的单例),并且我使系统完全模块化并且松散耦合.这反过来阻止我进行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对象中,并将它像一个小胶囊一样传递.关于如何解决这些后单例残留问题的任何想法?
这个项目是我个人的工作,我打算在我的简历上使用它 - 因此,我不希望我的潜在雇主看到任何单身人士(我也不想解释为什么,因为我可以证明他们自己并非真正必要).
万分感谢!
编辑:排版.