服务定位器和工厂设计模式之间的区别是什么?

时间:2011-11-30 12:00:38

标签: c# design-patterns service factory

我正在使用统一,我正在创建一个包装它的类,我不知道如何调用它,服务定位器或工厂,都封装了对象的创建,所以....有什么区别?

3 个答案:

答案 0 :(得分:21)

工厂在请求时为您创建对象。

服务定位器返回可能已存在的对象,即可能已存在于某处的服务。

想想名字的含义:

  • 工厂:是创建对象的地方。
  • 服务:可以为您提供服务。
  • 服务定位器:可以找到可以执行服务的东西。

答案 1 :(得分:6)

实际上这两种模式之间存在明显的分离。众所周知,两种模式都用于避免具体类型的依赖性。

但阅读后

出现了一些严重的矛盾:

Seemann说:“抽象工厂是一种泛型类型,Create方法的返回类型由工厂本身的类型决定。换句话说,构造类型只能返回单个类型的实例。”

虽然Rober C. Martin没有提及有关泛型类型的任何内容,而且,他的书中的工厂示例允许创建多个类型对象的实例,使用键字串作为Factory.Make中的参数来区分它们( )。

Gamma表示抽象工厂的意图是“提供一个界面来创建相关或依赖对象的族,而不指定它们的具体类”。值得一提的是,Gamma抽象工厂示例违反了Martin所述的接口隔离原则(ISP)。 ISP和SOLID通常是更现代的原则,或者为了简单而省略。

Gamma和Martin的作品先于Seemann's,所以我认为他应该遵循已经做出的定义。

虽然福勒提出服务定位器作为实现依赖性倒置的一种方式,但Seemann认为它是一种反模式。 Gamma或Martin都没有提到服务定位器。

然而,Seemann和Fowler一致认为,服务定位器需要一个配置步骤来注册一个混凝土类的实例,该实例是在请求该类对象时稍后返回的内容。 Martin或Gamma在抽象工厂的定义中没有提到这个配置步骤。抽象工厂模式假设每次请求该类对象时都要实例化一个新对象。

<强>结论

Service Locator和Abstract Factory之间的主要区别在于Abstract Factory假设一个新对象被实例化,并在每个请求时返回,并且Service Locator需要配置一个对象实例,并且每次都返回相同的实例。

答案 2 :(得分:4)