什么时候应该使用单例模式和静态方法?

时间:2015-03-10 12:48:17

标签: php design-patterns singleton static-methods

我应该何时使用单例模式和静态(静态方法和静态属性)?

我已经阅读了许多博客/教程/评论总是说单身模式,所以我从不使用它。

但同样,有许多php框架正在使用单例,例如Laravel,这些日子越来越受欢迎。

例如,在Laravel中,

$app->singleton(
    'Illuminate\Contracts\Http\Kernel',
    'App\Http\Kernel'
);

$app->singleton(
    'Illuminate\Contracts\Console\Kernel',
    'App\Console\Kernel'
);

$app->singleton(
    'Illuminate\Contracts\Debug\ExceptionHandler',
    'App\Exceptions\Handler'
);

如果你检查一下,你可以在Laravel(似乎)中大量使用单身。那么发生了什么?

Singleton是STUPID that we should avoid中的第一个字母。

但我相信一些程序员会强烈反对 - Its the best way to do it in that situation - if you need to use them, use them. Simple as that.

那么,在在什么情况下那么如果你不同意STUPID,你应该使用单身人士?

此外,在Laravel中,你会看到很多这些,

$users = DB::table('users')->get();

它是单身静态方法我猜(我不太擅长Laravel - 刚刚开始研究它)。

它似乎很容易使用,但在测试中,它们难以测试吗?

我在其他框架中也看到了这个方法(DB::something(...))。他们似乎不是一个好主意,但我相信许多人也不同意。那么在什么情况下你应该使用静态方法呢?

1 个答案:

答案 0 :(得分:1)

我建议,当你需要配置构建成本高昂的资源时,最好使用单例,这是实际意义上的。

在大多数情况下,您会发现框架倾向于围绕数据库连接创建单例。这允许跨框架重用数据库连接的资源,而无需在每次查询时重建与配置的连接。

laravel使用像DB::table这样的静态方法的方式是,它只是一个围绕单例的包装器,或者他们喜欢称之为控制容器的反转(http://laravel.com/docs/4.2/ioc)。如果您需要使用不同的资源,那么目的就是允许您拥有一个静态接口,您可以为其更改后端单例提供程序。

要回答最后一部分,静态方法的最佳目的是对类的静态或常量属性运行一些计算,这些属性不需要存在实例(考虑Java: when to use static methods)。< / p>