本文目录导读:

我来通过一个具体的计算器案例,演示Java简单工厂模式的完整实现流程。
案例:不同形状的面积计算器
创建抽象产品(接口或抽象类)
// Shape.java - 图形接口
public interface Shape {
double calculateArea();
String getShapeName();
}
创建具体产品类
// Circle.java - 圆形
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
@Override
public String getShapeName() {
return "圆形";
}
}
// Rectangle.java - 矩形
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
@Override
public String getShapeName() {
return "矩形";
}
}
// Triangle.java - 三角形
public class Triangle implements Shape {
private double base;
private double height;
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double calculateArea() {
return 0.5 * base * height;
}
@Override
public String getShapeName() {
return "三角形";
}
}
创建工厂类
// ShapeFactory.java - 形状工厂
public class ShapeFactory {
// 静态工厂方法
public static Shape createShape(String shapeType, double... params) {
if (shapeType == null) {
return null;
}
switch (shapeType.toLowerCase()) {
case "circle":
if (params.length >= 1) {
return new Circle(params[0]); // 半径
}
break;
case "rectangle":
if (params.length >= 2) {
return new Rectangle(params[0], params[1]); // 宽、高
}
break;
case "triangle":
if (params.length >= 2) {
return new Triangle(params[0], params[1]); // 底、高
}
break;
default:
throw new IllegalArgumentException("不支持的图形类型: " + shapeType);
}
throw new IllegalArgumentException("参数数量不正确");
}
}
客户端测试类
// Client.java - 测试类
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("=== 简单工厂模式 - 面积计算器 ===");
System.out.println("支持的图形类型:circle(圆形), rectangle(矩形), triangle(三角形)");
try {
// 获取用户输入
System.out.print("请输入图形类型: ");
String shapeType = scanner.nextLine();
Shape shape = null;
// 根据不同类型获取参数
switch (shapeType.toLowerCase()) {
case "circle":
System.out.print("请输入半径: ");
double radius = scanner.nextDouble();
shape = ShapeFactory.createShape("circle", radius);
break;
case "rectangle":
System.out.print("请输入宽度: ");
double width = scanner.nextDouble();
System.out.print("请输入高度: ");
double height = scanner.nextDouble();
shape = ShapeFactory.createShape("rectangle", width, height);
break;
case "triangle":
System.out.print("请输入底边长: ");
double base = scanner.nextDouble();
System.out.print("请输入高度: ");
double triHeight = scanner.nextDouble();
shape = ShapeFactory.createShape("triangle", base, triHeight);
break;
default:
System.out.println("不支持的图形类型!");
return;
}
// 输出结果
System.out.println("\n=== 计算结果 ===");
System.out.println("图形类型: " + shape.getShapeName());
System.out.println("面积: " + String.format("%.2f", shape.calculateArea()));
} catch (Exception e) {
System.out.println("计算错误: " + e.getMessage());
} finally {
scanner.close();
}
}
}
扩展:使用枚举实现工厂
// ShapeType.java - 图形类型枚举
public enum ShapeType {
CIRCLE, RECTANGLE, TRIANGLE;
// 工厂方法
public Shape create(double... params) {
switch (this) {
case CIRCLE:
return new Circle(params[0]);
case RECTANGLE:
return new Rectangle(params[0], params[1]);
case TRIANGLE:
return new Triangle(params[0], params[1]);
default:
throw new IllegalArgumentException("不支持的图形类型");
}
}
}
// 使用枚举的客户端
public class ClientEnum {
public static void main(String[] args) {
// 使用枚举创建对象
Shape circle = ShapeType.CIRCLE.create(5.0);
Shape rectangle = ShapeType.RECTANGLE.create(4.0, 6.0);
Shape triangle = ShapeType.TRIANGLE.create(3.0, 4.0);
System.out.println("圆形面积: " + circle.calculateArea());
System.out.println("矩形面积: " + rectangle.calculateArea());
System.out.println("三角形面积: " + triangle.calculateArea());
}
}
完整项目结构
src/
├── main/
│ └── java/
│ ├── shapes/
│ │ ├── Shape.java (接口)
│ │ ├── Circle.java (具体产品)
│ │ ├── Rectangle.java (具体产品)
│ │ └── Triangle.java (具体产品)
│ ├── factory/
│ │ ├── ShapeFactory.java (工厂类)
│ │ └── ShapeType.java (枚举工厂)
│ └── client/
│ ├── Client.java (测试类)
│ └── ClientEnum.java (枚举测试类)
运行效果示例
=== 简单工厂模式 - 面积计算器 ===
支持的图形类型:circle(圆形), rectangle(矩形), triangle(三角形)
请输入图形类型: circle
请输入半径: 5
=== 计算结果 ===
图形类型: 圆形
面积: 78.54
关键要点
- 工厂角色:负责创建具体产品,封装创建逻辑
- 产品角色:定义公共接口,具体产品实现该接口
- 客户端:通过工厂间接使用产品,无需知道创建细节
优缺点
优点:
- 客户端只需要知道产品类型,不需要关心创建过程
- 新增产品时,只需要修改工厂类
缺点:
- 工厂类职责过重,添加新产品需要修改工厂代码
- 不满足开闭原则(对扩展开放,对修改关闭)
这个案例演示了简单工厂模式的基本用法,适合在业务场景不复杂时使用。