Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 单例模式-哪一种是更好的实践?_Design Patterns_Singleton - Fatal编程技术网

Design patterns 单例模式-哪一种是更好的实践?

Design patterns 单例模式-哪一种是更好的实践?,design-patterns,singleton,Design Patterns,Singleton,我有一个单例,我正在争论是否有一些静态方法对客户端隐藏单例的用法是不好的做法。例如: Singleton::Instance()->Foo(); Vs 其中定义了FooHelper: class Singleton { ... static void FooHelper() { Singleton::Instance()->Foo(); } ... } 第二种解决方案是否被视为不良做法?我不会为所有的Singleton方法

我有一个单例,我正在争论是否有一些静态方法对客户端隐藏单例的用法是不好的做法。例如:

Singleton::Instance()->Foo();
Vs

其中定义了FooHelper:

class Singleton
{
    ...

    static void FooHelper()
    {
        Singleton::Instance()->Foo();
    }
    ...
}

第二种解决方案是否被视为不良做法?我不会为所有的Singleton方法生成帮助函数,只是那些客户端代码经常使用的方法。

一个想法是完全摆脱Singleton。在您的系统中,使它成为一个具有适当所有者的适当类,其他哪些类必须去获得该对象。然后您可以像“普通”对象一样访问它,它看起来不会那么刺耳

许多人认为。我发现它们的一个大问题是,当有一天你发现需要时,它们会使你的代码很难通用化。随着计算机的速度越来越快,内核越来越多,在我工作的地方,我们现在发现自己需要在同一台机器上同时运行多个主程序的能力。要做到这一点,最大的挑战是我们愚蠢地编码了所有的单身汉


尝试一下不使用单例,看看效果如何。

只要1°原始的
Foo()
方法仍然是公开的,2°命名方案表明
fooheloper()
相当于在实例上调用
Foo()
,这是一种不错的做法


当然,如果您发现自己总是调用
fooheloper()
,而从不调用
Foo()
,请重新考虑您的设计:单例的观点(与命名空间方法中的普通全局函数相反)就是说它是一个对象,所以至少你的代码的某些部分应该这样使用它。

+1对于删除单例的明智建议。虽然这是一个好建议,但单例替代了一个全局变量,重构使其具有所有者是不可能的。不过总的来说,我同意你的看法。谢谢你对我的问题的帮助!
class Singleton
{
    ...

    static void FooHelper()
    {
        Singleton::Instance()->Foo();
    }
    ...
}