用最简单的话来说,什么是工厂?

2022-09-01 02:49:18

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


答案 1

你熟悉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的一部分。importimport com.mysql.jdbc.ConnectionImpljava.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等)。

另请参阅:


答案 2

在需要在运行时创建对象的多个实例的情况下,工厂设计模式是理想的选择。您可以初始化多个实例,而不是显式创建每个实例。此外,还可以封装可多次重用的复杂创建代码。

例:

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 对象。


推荐