首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务定位器和工厂设计模式有什么区别?

服务定位器和工厂设计模式有什么区别?
EN

Stack Overflow用户
提问于 2011-11-30 12:00:37
回答 3查看 8K关注 0票数 16

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-30 12:03:35

工厂应请求为您创建对象。

服务定位器返回可能已经存在的对象,即可能已经存在于您的某个地方的服务。

想想这些名字的含义:

created.

  • Service:是一个可以作为service.

  • Service定位器为您做一些事情的东西:可以找到可以执行服务的东西。
票数 34
EN

Stack Overflow用户

发布于 2015-02-08 02:46:01

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

不过,读完后

Rober . Martin

  • Inversion of Containers的
  • 敏捷软件开发、原则、模式和实践书,以及Martin在“http://martinfowler.com/articles/injection.html
  • Pattern识别:抽象工厂还是服务定位器”中的依赖注入模式文章?马克·西曼( Mark )在http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
  • Design模式书上的文章,作者是埃里希·伽玛( Erich Gamma )等

出现了一些严重的矛盾:

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

RoberC.Martin没有提到泛型类型,而且,他的书中的工厂示例允许创建多个类型的对象的实例,在Factory.Make()中使用键字符串作为参数来区分它们。

Gamma说抽象工厂的意图是“为创建相关或依赖对象的家族提供一个接口,而不指定它们的具体类”。值得一提的是,Gamma抽象工厂示例违反了Martin提出的接口隔离原则(ISP)。ISP和SOLID在一般情况下是更现代的原则,也可能是为了简单而省略。

伽马和马丁的作品先于西曼的作品,所以我认为他应该遵循已经做出的定义。

Fowler提出服务定位器作为一种实现依赖反转的方法,而Seemann则认为它是一种反模式。Gamma和Martin都没有提到服务定位器。

但是,Seemann和Fowler在Service中同意需要一个配置步骤来注册一个具体化类的实例,该实例将在请求该类型的对象时返回。Martin或Gamma在抽象工厂的定义中没有提到这个配置步骤。抽象工厂模式假设每次请求此类对象时都会实例化一个新对象。

结论

服务定位器和抽象工厂之间的主要区别是,抽象工厂假设在每个请求时实例化一个新的对象,并在每个请求时返回一个返回的对象,并且服务定位器需要配置一个对象实例,并且每次都会返回相同的实例。

票数 11
EN

Stack Overflow用户

发布于 2011-11-30 12:02:22

读马克·西曼的这篇文章

http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryOrServiceLocator.aspx http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

这对我们开始

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8325619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档