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

Fri*_*ren 13 c# service design-patterns factory

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

Mig*_*elo 24

工厂根据要求为您创建对象.

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

只要想想名字的含义:

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

  • 它不必创建新的服务对象...而是在尝试定位服务之前注册服务对象,可以是在应用程序启动时,以便将来服务定位器可以将该服务返回给调用者. (3认同)

小智 9

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

但读完后

出现了一些严重的矛盾:

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需要配置一个对象实例,并且每次都返回相同的实例.