gpt4 book ai didi

java - 简单来说,什么是工厂?

转载 作者:IT老高 更新时间:2023-10-28 20:52:38 27 4
gpt4 key购买 nike

什么是工厂,我为什么要使用工厂?

最佳答案

你熟悉JDBC吗? ?这是一个和所有(抽象)工厂。这是一个很好的现实世界示例。

// Factory method. Loads the driver by given classname. It actually returns a 
// concrete Class<Driver>. However, we don't need it here, so we just ignore it.
// It can be any driver class name. The MySQL one here is just an example.
// Under the covers, it will do DriverManager.registerDriver(new Driver()).
Class.forName("com.mysql.jdbc.Driver");

// Abstract factory. This lets the driver return a concrete connection for the
// given URL. You can just declare it against java.sql.Connection interface.
// Under the covers, the DriverManager will find the MySQL driver by URL and call
// driver.connect() which in turn will return new ConnectionImpl().
Connection connection = DriverManager.getConnection(url);

// Abstract factory. This lets the driver return a concrete statement from the
// connection. You can just declare it against java.sql.Statement interface.
// Under the covers, the MySQL ConnectionImpl will return new StatementImpl().
Statement statement = connection.createStatement();

// Abstract factory. This lets the driver return a concrete result set from the
// statement. You can just declare it against java.sql.ResultSet interface.
// Under the covers, the MySQL StatementImpl will return new ResultSetImpl().
ResultSet resultSet = statement.executeQuery(sql);

您不需要在代码中包含一行特定于 JDBC 驱动程序的 import。你不需要做 import com.mysql.jdbc.ConnectionImpl 什么的。您只需针对 java.sql.* 声明所有内容。你不需要自己做 connection = new ConnectionImpl(); 。您只需从抽象工厂获取它作为标准 API 的一部分。

如果您将 JDBC 驱动程序类名设为一个可在外部配置的变量(例如属性文件)并编写与 ANSI 兼容的 SQL 查询,那么您无需为每个单独的 Java 应用程序重写、重新编译、重建和重新分发全世界都知道的数据库供应商和/或 JDBC 驱动程序。您只需将所需的 JDBC 驱动程序 JAR 文件放在运行时类路径中并通过某些(属性)文件提供配置,而无需在您想要切换 DB 或在不同的 DB 上重用应用程序时更改任何 Java 代码行。

这就是接口(interface)和抽象工厂的力量。

另一个已知的现实世界示例是 Java EE。将“JDBC”替换为“Java EE”,将“JDBC 驱动程序”替换为“Java EE 应用服务器”(WildFly、TomEE、GlassFish、Liberty 等)。

另见:

关于java - 简单来说,什么是工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com