本文目录导读:

我来通过一个具体的计算器案例,演示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
关键要点
- 工厂角色:负责创建具体产品,封装创建逻辑
- 产品角色:定义公共接口,具体产品实现该接口
- 客户端:通过工厂间接使用产品,无需知道创建细节
优缺点
优点:
- 客户端只需要知道产品类型,不需要关心创建过程
- 新增产品时,只需要修改工厂类
缺点:
- 工厂类职责过重,添加新产品需要修改工厂代码
- 不满足开闭原则(对扩展开放,对修改关闭)
这个案例演示了简单工厂模式的基本用法,适合在业务场景不复杂时使用。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播