本文个人博客地址:https://www.leafage.top/posts/22418WBZ1
什么是服务器定位模式?
**服务定位模式(Service Locator Pattern)**是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装。该模式使用一个称为"Service Locator"的中心注册表来处理请求并返回处理特定任务所需的必要信息。其包含各服务的引用,并且封装了定位服务的逻辑。在类中使用 Service Locator 来获取所需服务的实例。
Service Locator 模式并不描述如何实例化服务,其描述了一种注册和定位服务的方式。通常情况下,Service Locator 模式与工厂模式(Factory Pattern)和依赖注入模式(Dependency Injection Pattern)等结合使用。服务定位器(通常 ServiceLocator 类提供 IServiceLocator 接口的实现单例,并负责管理该实例的创建和访问。ServiceLocator 类提供 IServiceLocator 接口的默认实现,例如 ActivatingServiceLocator 类,可以同时创建和定位服务)能够在不知道抽象类的具体类型的情况下定位到服务。例如,它可能会使用字符串或服务接口类型来影射服务,这允许在无需修改类的条件下替换依赖项的具体实现。
服务定位器模式的目标?
在以下场景中:某类ClassA依赖于服务ServiceA和服务ServiceB,服务的具体类型需在编译时指定。
这种条件下有以下缺点:
- 尝试替换或更新依赖项,必须更改类的源代码并且重新编译。
- 依赖项的具体实现必须在编译时可用。
- 测试该类非常困难,因为类对依赖项有直接的引用,则依赖项不能使用Stub或Mock对象替换。
- 该类包含用于创建、定位和管理依赖项的重复代码。
使用 Service Locator Pattern 来达成以下目标:
- 把类与依赖项解耦,从而使这些依赖项可被替换或者更新。
- 类在编译时并不知道依赖项的具体实现。
- 类的隔离性和可测试性非常好。
- 类无需负责依赖项的创建、定位和管理逻辑。
- 通过将应用程序分解为松耦合的模块,达成模块间的无依赖开发、测试、版本控制和部署。
服务定位器模式用在使用 Java命名与目录接口-JNDI(Java Naming and Directory Interface, Java命名和目录接口) 查询定位各种服务的时候,该模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在缓存中查找。服务定位器模式包含:
- 服务(Service):实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到;
- Context:JNDI Context 带有对要查询的服务的引用;
- 服务定位器(Service Locator):服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触;
- 缓存(Cache):缓存存储服务的引用,以便复用;
- 客户端(Client):通过 ServiceLocator 调用服务的对象;