Java 工厂类是干什么的?

在 Java 编程中,工厂类(Factory Class)是一种设计模式,用于创建对象。它通过将对象的创建和使用分离开来,提供了一种灵活的方式来创建不同类型的对象,而无需在代码中直接实例化它们。

工厂类的主要目的是封装对象的实例化过程,并提供一个统一的接口来创建这些对象。它可以根据特定的条件或需求,决定创建哪种类型的对象,并返回一个相应的实例。这种方式在编程中非常常见。

工厂类的优点

使用工厂类有以下几个优点:

  1. 代码解耦:工厂类将实例化对象的代码与使用对象的代码分离开来,使得代码更加清晰和易于维护。实例化对象的逻辑变化时,只需要修改工厂类的代码,而不需要修改使用对象的代码。

  2. 隐藏具体实现:工厂类隐藏了对象的具体实现细节,使得使用者无需关心对象是如何创建的。这样可以提高代码的可扩展性和灵活性。

  3. 统一创建接口:工厂类提供了一个统一的接口来创建对象,使代码更加整洁和易于理解。使用者只需要调用工厂类的方法,而不需要关心对象的具体创建细节。

  4. 方便管理对象:工厂类可以统一管理对象的创建过程,可以在创建对象之前进行一些处理,如缓存已创建的对象、限制对象的创建数量等。

工厂类的实现

下面通过一个例子来演示如何使用工厂类创建对象。

假设我们有一个图形类 Shape,有两个子类 CircleRectangle。我们希望根据不同的需求来创建不同类型的图形对象。

首先,我们定义 Shape 类:

public abstract class Shape {
    public abstract void draw();
}

接下来,我们创建 Circle 类和 Rectangle 类,它们分别继承自 Shape 类:

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

现在,我们需要一个工厂类 ShapeFactory 来创建图形对象。首先,我们定义一个枚举类 ShapeType,用于表示图形类型:

public enum ShapeType {
    CIRCLE, RECTANGLE
}

然后,我们创建 ShapeFactory 类:

public class ShapeFactory {
    public static Shape createShape(ShapeType type) {
        switch (type) {
            case CIRCLE:
                return new Circle();
            case RECTANGLE:
                return new Rectangle();
            default:
                throw new IllegalArgumentException("Invalid shape type: " + type);
        }
    }
}

在上面的代码中,ShapeFactory 类提供了一个静态方法 createShape(),根据传入的 ShapeType 参数来创建相应的图形对象。如果传入的参数不合法,则抛出异常。

现在,我们可以使用 ShapeFactory 类来创建图形对象了:

public class Main {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.createShape(ShapeType.CIRCLE);
        circle.draw(); // 输出:Drawing a circle

        Shape rectangle = ShapeFactory.createShape(ShapeType.RECTANGLE);
        rectangle.draw(); // 输出:Drawing a rectangle
    }
}

在上面的代码中,我们通过调用 ShapeFactory.createShape() 方法来创建图形对象,并调用 draw() 方法来绘制图形。

序列图

下面是使用序列图来表示上面的代码流程:

sequenceDiagram
    participant Client
    participant ShapeFactory
    participant Circle
    participant Rectangle
    
    Client->>ShapeFactory: 使用ShapeFactory创建图形对象
    ShapeFactory-->>Circle: 创建Circle对象
    Circle-->>Client: 返回Circle对象
    Client->>Circle: 调用Circle对象的draw方法
    Client->>ShapeFactory: 使用ShapeFactory创建图形对象
    ShapeFactory-->>Rectangle: 创建Rectangle对象