当前位置: 首页 > 面试题库 >

使用工厂方法了解JDBC之类的服务提供程序框架背后的概念

宰父深
2023-03-14
问题内容

在有效的Java中(
第1项考虑静态工厂方法而不是构造函数 ):

静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在。这种灵活的静态工厂方法构成了服务提供程序框架的基础,例如Java数据库连接API(JDBC)。服务提供者框架是一个系统,其中多个服务提供者实现了一项服务,并且该系统使实现可用于其客户端,从而将它们与实现分离。

我特别不明白为什么书说的是静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以用JDBC为例进行说明。


问题答案:

考虑如下内容:

public interface MyService {
  void doSomething();
}

public class MyServiceFactory {
  public static MyService getService() {
    try {
      (MyService) Class.forName(System.getProperty("MyServiceImplemetation")).newInstance();
    } catch (Throwable t) {
      throw new Error(t);
    }
  }
}

使用此代码,您的库无需了解服务的实现。库的用户必须设置一个系统属性,其中包含他们要使用的实现的名称。

这就是您不理解的句子的意思:factory方法将返回某个类的实例(其名称存储在系统属性“
MyServiceImplementation”中),但绝对不知道它是什么类。它所知道的就是它实现了MyService,并且必须有一个公共的,无参数的构造函数(否则,上面的工厂将抛出Error)。



 类似资料:
  • 问题内容: 什么是之间的差异,并在AngularJS? 问题答案: 从AngularJS邮件列表中,我得到了一个很棒的线程,它解释了服务,工厂,提供者及其注入用法。汇编答案: 语法: 结果:在将serviceName声明为可注入参数时 ,将为您提供函数实例。 换句话说 。 工厂名称 语法: 结果:在将factoryName声明为可注入参数时,将为您提供 通过调用传递给module.factory的

  • 问题内容: 我指的是“ 有效Java ”的第2章中讨论的“服务提供者框架” ,这似乎是解决我遇到的问题的正确方法,其中我需要在运行时实例化几个类之一,并根据选择一个服务和一个对象(基本上是XML代码段): 但是,如何让各个服务提供者(例如,一堆默认提供者+一些自定义提供者)进行注册? 例如,如果我编写了自定义类MyFooAlgorithm和MyFooAlgorithmProvider来实现FooA

  • 问题内容: 查看Guava的ImmutableList(和其他一些类),您会发现很多重载的便捷方法(“按顺序返回包含给定元素的不可变列表”。)这些方法使用不同数量的参数: 一直到这一步: 我的一些同事认为这很愚蠢,想知道为什么不只有一种方法:。他们怀疑这是不正确的性能“优化”,属于“您认为自己比编译器更聪明”之类的东西。 我的直觉是Kevin Bourrillion等。出于真正的原因将这些方法放在

  • 问题内容: 我正在尝试将Entity Framework与MySQL配合使用,但出现上述错误。我安装了最新的MySQL连接器。 完整错误为: 但是,我找不到任何建议说明您如何在“ entityFramework”部分中进行注册的内容。 其他一些帖子(例如)建议将提供程序添加到该 部分中,如下所示: 但这不起作用,因为它声称名称是重复的。而且,如果我实际上遍历了,我可以看到最后一个是MySQL提供程

  • 考虑一个场景,我想用一些数据获取,并将其解析为特定类型的对象,例如。免责声明:虽然很长,但这是一个sscce;我的实际项目与猫的声音关系不大:) 要求: 第一个字符表示“动物的类型”。所以 可能指抽象, 可能指。 第二个字符可选地表示“动物的亚型”...除了这些子类型被分组到类别中(就类而言)。所以CS可能是ThaiCat扩展Cat与参数“”,可能是扩展Cat与参数,可能是扩展与参数 中包含其他信

  • 错误消息: System.InvalidOperationException:未找到具有固定名称“System.Data.SqlClient”得ADO.NET提供程序得实体框架提供程序.确保在应用程序配置文件的“Entity Framework”部分中注册了提供程序。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。