核心思想
将构建依赖的接口彻底与依赖者分离,并将此依赖作为“服务”绑定到一个标识符,而后依赖者则可通过这个标识符获取被绑定的依赖。
优点
- 上层逻辑不依赖于服务接口的具体实现,实现解耦
- 提高系统的可扩展性
- 逻辑分层更加简洁清晰,使不同层次的开发人员各司其职,提高团队开发效率
适用场景
与 (Abstract) Factory Patten 比较
- Factory Patten 创建的所有结果对象多有统一的抽象接口的(更具一般性的)对象
- Service Locator Patten 创建的服务,异构性程度比较大,接口缺少一般性
- Factory Patten 单纯为创建对象
- Service Locator Patten 职能更多些,包括创建服务、配置服务、注入服务的依赖等等
与 Dependence Injection Container 配合
- Service Locator Patten 和 Dependence Injection并不互斥
- Service Locator Patten 在定位服务时,创建服务、配置服务、注入服务的依赖通过Dependence Injection Container实现,可以进一步解耦
与 Proxy Patten 配合
- 对创建的服务进行抽象,增强服务的一般性(即抽象出统一接口)
与 Singleton Patten 配合
- 承担特定职责的Service Locator的对象无需多次实例化,节省开销
- 对Service Locator定位的服务缓存做集中存储,存储数据结构存于Service Locator的单例对象即可
优化和扩展
- 与多种设计模式配合使用
- 在Service Locator类里定义服务实例化对象的缓冲池,使服务只实例化1次,节省开销