使用工厂方法理解 JDBC 等服务提供者框架背后的概念

2023-12-25

From (Item 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);
    }
  }
}

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

这就是你不明白的那句话的意思:工厂方法将返回某个类的实例(该类的名称存储在系统属性“MyServiceImplementation”中),但它完全不知道它是什么类。它所知道的只是它实现了MyService并且它必须有一个公共的、无参数的构造函数(否则,上面的工厂将抛出一个Error).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用工厂方法理解 JDBC 等服务提供者框架背后的概念 的相关文章

随机推荐

  • 滚动到 angular2 时动画进入视图

    我找到了一个库 用于在滚动到 aos https github com michalsnik aos 但它似乎没有任何 angular2 绑定可供使用 有谁知道如何在 Angular2 中完成类似的事情 或者至少配置 aos 在 Angul
  • 如何在iPhone中创建应用程序包?

    我使用 XCode 制作了一个小型应用程序 我如何创建一个应用程序包以将其安装在 iPhone 中 谁能帮我解决这个问题 提前致谢 是的 如上所述 您需要支付 99 美元的开发者费用 完成此操作后 您可以通过 XCode 直接部署到使用配置
  • PHP 中的数组打乱顺序

    我有以下代码 输出如下 域名 com image1 jpg 域名 com image2 jpg 域名 com image3 jpg 我正在尝试随机化输出的顺序 在 foreach 语句之前 我尝试使用 shuffle bb 对数组进行洗牌
  • 创建与 DetailView 相反的视图

    上传图像后 我试图从 CreateView 反转到 DetailView 我收到同样的消息 NoReverseMatch 位于 photo image add 未找到带有参数 和关键字参数 pk 50 的 image view 的反向操作
  • SailsJS Waterline 与 Bluebird Promises

    使用 Waterline ORM 时 如果我想使用默认提供的 bluebird Promise api 如何将处理传递回控制器 下面是代码 module exports Authenticate auth function req res
  • 如何衡量两个数据的相似度

    我正在测量两个大小相同的数据的相似度为20 即 A 0 915450999999999 0 908220499999997 0 900374999999996 0 890547499999996 0 880455499999997 0 86
  • 如何让 Firestore 索引合并发挥作用?

    我在使用 firestore 索引合并来减少所需索引的数量时遇到问题 考虑这个示例情况 Firestore 集合 测试 somedoc a 1 b 1 c 1 d 1 这将导致 Firestore 在测试时为字段 a 到 d 创建 4 个自
  • scala.js 与 jscala 有什么区别?

    有两个工具可以直接在 JavaScript 中编译 Scala 代码 Scala js http www scala js org and JScala https github com nau jscala 它们看起来都很棒 并且可以使用
  • issubclass 的用法

    gt gt gt import sys gt gt gt sys version info 2 4 4 final 0 gt gt gt class C pass gt gt gt issubclass C C True gt gt gt
  • 处理 Akka actor 中的错误

    我有一个非常简单的例子 我有一个演员 SimpleActor 通过向自身发送消息来执行周期性任务 该消息在参与者的构造函数中安排 在正常情况下 即没有故障 一切正常 但如果 Actor 必须处理错误怎么办 我还有另一个演员 SimpleAc
  • 捕获 C++ CLI 应用程序中登录的异常

    我试图捕获 C CLI 应用程序中的所有异常 以便我可以记录它们 包括堆栈跟踪 到目前为止 我有一些看起来很有希望的代码 STAThreadAttribute int main array
  • 使用 cffi-libffi 按值传递结构?

    我的印象是 CFFI 无法按值传递结构 但 CFFI 文档说 要将结构按值传递或返回给函数 请加载 cffi libffi 系统并将结构指定为 struct structure name 要传递或返回指针 您可以使用 pointer or
  • `--oom-kill-disable` 对 Docker 容器有什么作用?

    我已经明白了docker run m 256m memory swap 256m将限制容器 使其最多可以使用 256 MB 内存且无交换区 如果它分配更多 那么容器中的进程 不是 容器 将被杀死 例如 sudo docker run it
  • 在 Javascript 客户端中处理不成功的 websocket 升级请求

    我想让一个 javascript 客户端进程获取当客户端发出 websocket 升级请求并且该请求不成功时服务器返回的 HTTP 状态代码 我的服务器返回 HTTP 400 来指示 Websocket 升级不成功 我正在使用 Google
  • 如何在 WPF 中构建“逐字”自动完成功能?

    我已经做了一些研究 最终得到了几个自动完成框 它们有一个共同点 它们都与已输入的整个表达式匹配 有时 它们看起来很容易扩展 但最终却并非如此 但是 我需要一个文本框 允许用户输入一个单词 例如 tag1 显示一个带有一些建议的弹出窗口基于这
  • URL 路径参数用例

    通常 当我想到 URL 中的参数时 我会想到查询字符串 然而从技术上讲 在路径段中指定参数也是合法的 因此给出一个像这样的 URL http www a com frisbee brand 写成这样是合法的 http www a com f
  • Razor 页面中的 Blazor 组件

    我们有一个基本的剃刀页面应用程序 我们想添加 Blazor 组件 通过复制 04 16 Blazor 更新视频中的步骤或使用 Blazor 文档 我们可以毫无问题地使其发挥作用 但是 一旦我们将 Blazor 组件添加到 Razor 页面
  • ASP.Net / C# - 缺少程序集引用

    Hi I am a newbie in C and visual studio As Figure1 shown I am trying to use the classes from other project in similar so
  • MIPS 中基于指针的数组访问

    MIPS 中基于指针的数组访问是什么意思 基于指针的数组访问 还有一个额外的可能含义或含义 您可能有一个指向数组的指针 而不是位于固定地址的数组 实际上 在 C C 中 指向数组的指针 实际上通常只是指向数组第一个元素的指针 基本上 您有一
  • 使用工厂方法理解 JDBC 等服务提供者框架背后的概念

    From Item 1 考虑静态工厂方法而不是构造函数 静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时 这样灵活的静态工厂 方法构成了服务提供者框架的基础 例如 Java 数据库 连接 API JDBC 服务提供者框架是一