服务定位器和工厂设计模式之间的区别是什么?
本文关键字:区别 是什么 之间 设计模式 定位器 工厂 服务 | 更新日期: 2023-09-27 18:16:07
我使用unity,我正在创建一个类包装它,我不知道如何调用它,服务定位器或工厂,两者封装创建的对象,所以....有什么区别?
当你请求时,工厂为你创建对象。
服务定位器返回可能已经存在的对象,即可能已经存在于某个地方的服务。
想想这些名字的含义:
- Factory:是创建对象的地方。
- 服务:可以为你做某事的服务。
- 服务定位器:可以找到可以执行服务的东西。
实际上这两种模式之间有明显的区别。众所周知,这两种模式都用于避免依赖于具体类型。
然而在read
之后- 敏捷软件开发,原则,模式和实践[书]作者:robert C. Martin
- 控制容器的反转和依赖注入模式[文章]由Martin Fowler在http://martinfowler.com/articles/injection.html
- 模式识别:抽象工厂还是服务定位器?[文章]Mark Seemann在http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
- Design Pattern[书]by Erich Gamma et al
出现了一些严重的矛盾:
Seemann说:"抽象工厂是一种泛型类型,Create方法的返回类型由工厂本身的类型决定。换句话说,构造类型只能返回单一类型的实例。"
虽然Rober C. Martin没有提到任何泛型类型,而且,在他的书中,工厂示例允许创建多个类型对象的实例,使用factory . make()中的关键字串作为参数来区分它们。
Gamma说抽象工厂的目的是"提供一个接口来创建相关或依赖的对象族,而不指定它们的具体类"。值得一提的是,Gamma抽象工厂的例子违反了Martin提出的接口隔离原则(ISP)。ISP和SOLID通常是更现代的原则,或者可能是为了简单起见而省略。
Gamma和Martin的作品先于Seemann的作品,所以我认为他应该遵循已经做出的定义。
当Fowler提出服务定位器作为实现依赖倒置的一种方式时,Seemann认为它是一种反模式。Gamma和Martin都没有提到服务定位器。
然而,Seemann和Fowler一致认为Service Locator需要一个配置步骤来注册一个具体类的实例,该实例将在以后请求该类对象时返回。Martin或Gamma在他们的抽象工厂定义中没有提到这个配置步骤。抽象工厂模式假定每次请求一个新对象时都会实例化一个新对象。
结论服务定位器和抽象工厂之间的主要区别是,抽象工厂假设一个新的对象被实例化并在每次请求时返回,而服务定位器需要配置一个对象实例,并且每次都会返回相同的实例。
阅读Mark Seemann的文章
http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryOrServiceLocator.aspxhttp://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
开头