服务定位器模式与抽象工厂模式有什么不同?

Mer*_*ham 39 design-patterns service-locator abstract-factory

乍一看,服务定位器模式与我的抽象工厂模式看起来相同.它们似乎都具有相同的用途(您查询它们以接收抽象服务的实例),并且当我阅读有关依赖注入时它们都被提及.

但是,我已经看到服务定位器模式被描述为一个糟糕的想法,但在至少一个主要的依赖注入框架中看到了对抽象工厂模式的直接支持.

如果它们不相同,有什么区别?

Gya*_*uyn 43

在调查这些模式时,我偶然发现了同样的问题.我认为服务定位器和工厂之间可以找到主要区别(无论是抽象的还是抽象的):

服务定位器

  • '找到' 现有依赖项(服务).尽管可以在解析期间创建服务,但对客户来说无关紧要,因为:
  • 服务定位器的客户端不接受依赖项的所有权.

  • 创建依赖项的新实例.
  • 工厂的客户获得依赖的所有权.

抽象工厂

  • 与常规工厂相同,只是不同的部署可能使用抽象工厂的不同实现,允许在不同的部署中实例化不同的类型(您甚至可以在运行时更改抽象工厂的实现,但通常不会如何使用它.)


Mer*_*ham 13

从我到目前为止所读到的,我认为区别在于:

服务定位器模式

  • 明确支持注册应创建/返回的具体对象
  • 通常有一个通用接口,允许用户请求任何抽象类型,而不是特定类型
  • 可能本身就是具体的

抽象工厂模式

  • 可能不支持注册 - 这取决于支持或不支持的具体实现,并且可能不会在抽象接口上公开
  • 通常有特定抽象类型的多个get方法
  • 本身不是具体的(虽然当然会有具体的实施)