Когда я должен использовать одноэлементный шаблон и статические (статические методы и статические свойства)?
Я прочитал много блогов / учебных пособий / комментариев, в которых всегда говорится, что шаблон синглтона, поэтому я никогда не использую его.
Но опять же, есть много 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 (кажется). Так, что происходит?
Синглтон это первая буква в Глупый, что мы должны избегать насколько понимаю.
Но я считаю, что некоторые программисты будут категорически не согласны — 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(...)
) много и в других рамках. Они кажутся не очень хорошей идеей, но многие тоже не согласятся. Так в какие ситуации Вы должны использовать статические методы тогда?
Я хотел бы предположить, что наилучшее использование синглтона, которое имеет практический смысл, — это когда вам нужно настроить ресурс, который стоит создать дорого.
В большинстве случаев вы обнаружите, что фреймворки, как правило, создают единое пространство вокруг соединений с базой данных. Это позволяет повторно использовать ресурс соединения с базой данных во всей структуре без необходимости перестраивать соединение с конфигурациями при каждом запросе.
То, как Laravel использует статические методы, такие как DB::table
является то, что это будет просто обертка вокруг синглтона, или, как им нравится называть это, инверсия контейнера управления (http://laravel.com/docs/4.2/ioc). Цель состоит в том, чтобы предоставить вам статический интерфейс, для которого вы можете сменить внутреннего одноэлементного поставщика, если вам потребуется использовать другой ресурс.
Чтобы ответить на последнюю часть, лучшей целью статического метода было бы выполнение вычислений над статическими или константными свойствами класса, которым не нужен экземпляр для существования (рассмотрим Java: когда использовать статические методы).
Других решений пока нет …