Java 工厂类是干什么的?
在 Java 编程中,工厂类(Factory Class)是一种设计模式,用于创建对象。它通过将对象的创建和使用分离开来,提供了一种灵活的方式来创建不同类型的对象,而无需在代码中直接实例化它们。
工厂类的主要目的是封装对象的实例化过程,并提供一个统一的接口来创建这些对象。它可以根据特定的条件或需求,决定创建哪种类型的对象,并返回一个相应的实例。这种方式在编程中非常常见。
工厂类的优点
使用工厂类有以下几个优点:
-
代码解耦:工厂类将实例化对象的代码与使用对象的代码分离开来,使得代码更加清晰和易于维护。实例化对象的逻辑变化时,只需要修改工厂类的代码,而不需要修改使用对象的代码。
-
隐藏具体实现:工厂类隐藏了对象的具体实现细节,使得使用者无需关心对象是如何创建的。这样可以提高代码的可扩展性和灵活性。
-
统一创建接口:工厂类提供了一个统一的接口来创建对象,使代码更加整洁和易于理解。使用者只需要调用工厂类的方法,而不需要关心对象的具体创建细节。
-
方便管理对象:工厂类可以统一管理对象的创建过程,可以在创建对象之前进行一些处理,如缓存已创建的对象、限制对象的创建数量等。
工厂类的实现
下面通过一个例子来演示如何使用工厂类创建对象。
假设我们有一个图形类 Shape,有两个子类 Circle 和 Rectangle。我们希望根据不同的需求来创建不同类型的图形对象。
首先,我们定义 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对象
















