我应该何时使用单例模式和静态(静态方法和静态属性)?
我已经阅读了许多博客/教程/评论总是说单身模式,所以我从不使用它。
但同样,有许多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(...)
)。他们似乎不是一个好主意,但我相信许多人也不同意。那么在什么情况下你应该使用静态方法呢?
答案 0 :(得分:1)
我建议,当你需要配置构建成本高昂的资源时,最好使用单例,这是实际意义上的。
在大多数情况下,您会发现框架倾向于围绕数据库连接创建单例。这允许跨框架重用数据库连接的资源,而无需在每次查询时重建与配置的连接。
laravel使用像DB::table
这样的静态方法的方式是,它只是一个围绕单例的包装器,或者他们喜欢称之为控制容器的反转(http://laravel.com/docs/4.2/ioc)。如果您需要使用不同的资源,那么目的就是允许您拥有一个静态接口,您可以为其更改后端单例提供程序。
要回答最后一部分,静态方法的最佳目的是对类的静态或常量属性运行一些计算,这些属性不需要存在实例(考虑Java: when to use static methods)。< / p>