Різниця між Service Locator та Dependency Injection полягає в тому, як об'єкти отримують свої залежності. У Service Locator, об'єкти самостійно шукають потрібні залежності у спеціалізованому контейнері, тоді як у Dependency Injection, залежності передаються об'єкту ззовні. Давайте розглянемо приклад на PHP:
class ServiceLocator {
private $services = [];
public function __construct() {
// Реєструємо сервіси у контейнері
$this->services['userService'] = function() {
return new UserService();
};
}
public function getService($serviceName) {
if (isset($this->services[$serviceName])) {
return $this->services[$serviceName]();
}
throw new Exception('Сервіс не знайдено.');
}
}
class UserService {
public function getUser() {
return 'Користувач';
}
}
$serviceLocator = new ServiceLocator();
$userService = $serviceLocator->getService('userService');
echo $userService->getUser(); // Виведе: Користувач
Приклад Dependency Injection на PHP:
class UserService {
public function getUser() {
return 'Користувач';
}
}
class UserController {
private $userService;
public function __construct(UserService $userService) {
$this->userService = $userService;
}
public function showUser() {
echo $this->userService->getUser();
}
}
$userService = new UserService();
$userController = new UserController($userService);
$userController->showUser(); // Виведе: Користувач