该模式通常结合单例模式与抽象工厂使用
服务定位器也有不好的地方,它将查找和提供所需实例类型的责任委托给了提供方
Settings.php
class Settings{public static $COMMSTYPE = 'unix'}
AppConfig.php
class AppConfig{private static $instance;private CommsManager $commsManager;private __construct(){$this->init();}public static function getInstance(): self{if(empty(self::$instance)){self::instance = new self();}return self::$instance;}private function init(){switch(Settings::$COMMSTYPE){case 'unix':$this->commsManager =new UnixCommsManager();break;default:$this->commsManager = new WinCommsManager();}}public function getCommsManager(): CommsManager{return $this->commsManager;}}
与直接进行实例化相比,它引入的依赖关系更加缓和。任何使用其服务的类都必须显式的调用这个服务定位器,这会将它们与外部系统绑定在一起。
