Java简单工厂案例怎么实操

wen java案例 32

本文目录导读:

Java简单工厂案例怎么实操

  1. 案例:不同形状的面积计算器
  2. 关键要点
  3. 优缺点

我来通过一个具体的计算器案例,演示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

关键要点

  1. 工厂角色:负责创建具体产品,封装创建逻辑
  2. 产品角色:定义公共接口,具体产品实现该接口
  3. 客户端:通过工厂间接使用产品,无需知道创建细节

优缺点

优点

  • 客户端只需要知道产品类型,不需要关心创建过程
  • 新增产品时,只需要修改工厂类

缺点

  • 工厂类职责过重,添加新产品需要修改工厂代码
  • 不满足开闭原则(对扩展开放,对修改关闭)

这个案例演示了简单工厂模式的基本用法,适合在业务场景不复杂时使用。

抱歉,评论功能暂时关闭!