2015-03-10 9 views
0

Когда я должен использовать singleton pattern и static (статические методы и статические свойства)?Когда вы должны использовать одноэлементный шаблон и статические методы?

Я читал много блогов/учебников/комментариев, которые всегда говорят об одноэлементном шаблоне, поэтому я никогда не использую его.

Но опять же, многие фрэш-рамки используют синглтоны, такие как 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.

Итак, в каких ситуациях , то вы должны использовать одиночек, если вы не согласны с тупыми?

Кроме того, в Laravel, вы увидите много из них,

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

Это либо одноточечно или статический метод Я думаю (я не очень хорошо Laravel - только начинает смотреть внутрь).

Это кажется простым в использовании, но как насчет тестирования, сложно ли их протестировать?

Я вижу этот метод (DB::something(...)) много в других рамках. Они кажутся не очень хорошей идеей, но многие тоже не согласятся. Итак, в какие ситуации вы должны использовать статические методы?

ответ

1

Я бы предположил, что наилучшим образом использовать одноэлемент, что имеет практический смысл, - это когда вам нужно сконфигурировать ресурс, который стоит дорого строить.

В большинстве случаев вы обнаружите, что фреймворки имеют тенденцию создавать одноэлементные соединения с базой данных. Это позволяет повторно использовать ресурс подключения к базе данных без необходимости пересоединения соединения с конфигурациями каждого запроса.

Способ использования laravel использует статические методы, такие как DB::table, так это то, что это будет просто обертка вокруг синглтона или, как им нравится называть его, инверсия контейнера управления (http://laravel.com/docs/4.2/ioc). Цель состоит в том, чтобы позволить вам иметь статический интерфейс, для которого вы можете изменить внешний провайдер singleton, если вам нужно использовать другой ресурс.

Чтобы ответить на последнюю часть, наилучшей целью статического метода было бы либо выполнить некоторые вычисления по статическим или постоянным свойствам класса, которые не нуждаются в экземпляре (см. Java: when to use static methods).

+0

Спасибо за ответ Брайан. 'когда вам нужно сконфигурировать ресурс, который стоит дорого строить'', так что дорого строить? соединение db - так же, как Laravel? – oasis

Смежные вопросы