用最简单的话来说,什么是工厂?
2022-09-01 02:49:18
什么是工厂,我为什么要使用工厂?
你熟悉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 驱动程序。你不需要做或什么。你只需要声明一切反对.你不需要自己做。你只需要从抽象工厂获取它作为标准API的一部分。import
import com.mysql.jdbc.ConnectionImpl
java.sql.*
connection = new ConnectionImpl();
如果您使 JDBC 驱动程序类名成为一个可以在外部配置的变量(例如属性文件)并编写与 ANSI 兼容的 SQL 查询,那么您就不需要为世界上已知的每个数据库供应商和/或 JDBC 驱动程序重写、重新编译、重建和重新分发 Java 应用程序。您只需要将所需的 JDBC 驱动程序 JAR 文件放在运行时类路径中,并通过某些(属性)文件提供配置,而无需在想要切换 DB 或在另一个 DB 上重用应用程序时更改任何 Java 代码行。
这就是接口和抽象工厂的力量。
另一个已知的现实世界的例子是Java EE。将“JDBC”替换为“Java EE”,将“JDBC驱动程序”替换为“Java EE应用服务器”(WildFly,TomEE,GlassFish,Liberty等)。
在需要在运行时创建对象的多个实例的情况下,工厂设计模式是理想的选择。您可以初始化多个实例,而不是显式创建每个实例。此外,还可以封装可多次重用的复杂创建代码。
例:
public class Person {
int ID;
String gender;
public Person(int ID,String gender){
this.ID=ID;
this.gender=gender;
}
public int getID() {
return ID;
}
public String getGender() {
return gender;
}
}
public class PersonFactory{
public static Person createMale(int id){
return new Person(id,"M");
}
public static Person createFemale(int id){
return new Person(id,"F");
}
}
public class factorytest{
public static void main(String[]args){
Person[] pList= new Person[100];
for(int x=0;x<100;x++){
pList[x]=PersonFactory.createMale(x);
}
}
}
在此示例中,我们封装了性别初始化参数的详细信息,并且可以简单地要求 PersonFactory 创建 Male 或 createFemale Person 对象。