Service LocatorとDependency InjectionパターンとDI Container

本エントリーでは次の点を整理したいと思います。 ServiceLocatorパターンとは何か? Dependency Injection(以降DI)パターンとは何か? DI Containerとは何か? これらを使うと何がうれしいのか? ServiceLocatorとDI何が違うのか? ServiceLocatorとDIどちらを使うべきか?